¿Cómo obtener el código de salida al utilizar el método de comunicación de subproceso de Python?

¿Cómo recupero el código de salida cuando uso el módulo de subprocess de Python y el método de communicate() ?

Código relevante:

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

¿Debería estar haciendo esto de otra manera?

Popen.communicate establecerá el atributo de returncode cuando returncode (*). Aquí está la sección de documentación relevante:

 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). 

Así que puedes hacerlo (no lo probé pero debería funcionar):

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

(*) Esto sucede debido a la forma en que se implementa: después de configurar los subprocesos para leer las transmisiones del niño, simplemente llama a wait .

Primero debe asegurarse de que el proceso se haya completado en ejecución y que se haya leído el código de retorno utilizando el método .wait . Esto devolverá el código. Si desea acceder a él más tarde, se almacena como .returncode en el objeto Popen .

exitcode = data.wait() . El proceso hijo se bloqueará si se escribe en la salida / error estándar, y / o se lee desde la entrada estándar, y no hay pares.

.poll() actualizará el código de retorno.

Tratar

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

Además, después de .poll() el código de retorno está disponible en el objeto como child.returncode .

Esto funcionó para mí. También imprime la salida devuelta por el proceso hijo.

 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