web-dev-qa-db-fra.com

Comment obtenir le code de sortie lors de l'utilisation de la méthode de communication du sous-processus Python?

Comment récupérer le code de sortie lorsque j'utilise le module subprocess de Python et la méthode communicate()?

Code pertinent:

import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]

Devrais-je faire cela d'une autre manière?

167
CarpeNoctem

Popen.communicate définira l'attribut returncode quand ce sera fait (*). Voici la section de documentation pertinente:

Popen.returncode 
  The child return code, set by poll() and wait() (and indirectly by communicate()). 
  A None value indicates that the process hasn’t terminated yet.

  A negative value -N indicates that the child was terminated by signal N (Unix only).

Donc, vous pouvez simplement faire (je ne l'ai pas testé mais cela devrait fonctionner):

import subprocess as sp
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
streamdata = child.communicate()[0]
rc = child.returncode

(*) Cela est dû à la façon dont il est implémenté: après avoir configuré les threads pour lire les flux de l'enfant, il appelle simplement wait.

236
Eli Bendersky

Vous devez d'abord vous assurer que le processus est en cours d'exécution et que le code de retour a été lu à l'aide de la méthode .wait. Cela retournera le code. Si vous souhaitez y accéder ultérieurement, il est enregistré sous le nom .returncode dans l'objet Popen.

8
Noufal Ibrahim

exitcode = data.wait() . Le processus enfant sera bloqué s'il écrit dans la sortie standard/avec une erreur et/ou lit à partir de l'entrée standard et s'il n'y a pas de pairs.

6
khachik

.poll() mettra à jour le code de retour.

Essayer

child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()

De plus, après l’appel de .poll(), le code de retour est disponible dans l’objet sous la forme child.returncode.

2
Matthew Vernon

Cela a fonctionné pour moi. Il imprime également la sortie renvoyée par le processus enfant

child = subprocess.Popen(serial_script_cmd, Shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    retValRunJobsSerialScript = 0
    for line in child.stdout.readlines():
        child.wait()
        print line           
    retValRunJobsSerialScript= child.returncode
1
Chinni Mahesh