Python Language Plus de souplesse avec Popen


Exemple

Utiliser subprocess.Popen donne un contrôle plus fin sur les processus lancés que subprocess.call .

Lancer un sous-processus

process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])

La signature pour Popen est très similaire à la fonction d' call ; Cependant, Popen reviendra immédiatement au lieu d'attendre que le sous-processus se termine comme l' call fait.

En attente d'un sous-processus pour terminer

process = subprocess.Popen([r'C:\path\to\app.exe', 'arg1', '--flag', 'arg'])
process.wait()

Lecture de la sortie d'un sous-processus

process = subprocess.Popen([r'C:\path\to\app.exe'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# This will block until process completes
stdout, stderr = process.communicate()
print stdout
print stderr

Accès interactif aux sous-processus en cours d'exécution

Vous pouvez lire et écrire sur stdin et stdout même si le sous-processus n'est pas terminé. Cela pourrait être utile lors de l'automatisation des fonctionnalités dans un autre programme.

Ecrire dans un sous-processus

process = subprocess.Popen([r'C:\path\to\app.exe'], stdout = subprocess.PIPE, stdin = subprocess.PIPE)


process.stdin.write('line of input\n') # Write input

line  = process.stdout.readline() # Read a line from stdout

# Do logic on line read.

Cependant, si vous n'avez besoin que d'un seul ensemble d'entrées et de sorties, plutôt que d'une interaction dynamique, vous devez utiliser communicate() plutôt que d'accéder directement à stdin et stdout .

Lecture d'un flux d'un sous-processus

Si vous souhaitez voir la sortie d'un sous-processus ligne par ligne, vous pouvez utiliser l'extrait suivant:

process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
    output_line = process.stdout.readline()

Dans le cas où la sortie de la sous-commande n'a pas de caractère EOL, l'extrait ci-dessus ne fonctionne pas. Vous pouvez ensuite lire le caractère de sortie par caractère comme suit:

process = subprocess.Popen(<your_command>, stdout=subprocess.PIPE)
while process.poll() is None:
    output_line = process.stdout.read(1)

Le 1 spécifié comme argument à la read méthode demande de lecture pour lire une nature à la fois. Vous pouvez spécifier de lire autant de caractères que vous voulez en utilisant un numéro différent. Le nombre négatif ou 0 indique de read pour lire en tant que chaîne unique jusqu'à ce que l'EOF soit rencontré ( voir ici ).

Dans les deux extraits ci-dessus, process.poll() est None jusqu'à la fin du sous-processus. Ceci est utilisé pour quitter la boucle une fois qu'il n'y a plus de sortie à lire.

La même procédure pourrait être appliquée au stderr du sous-processus.