¿Cómo obtener el código de salida cuando se utiliza el método de comunicación del subproceso de Python?
¿Cómo recupero el código de salida cuando uso subprocess
el módulo y el communicate()
método de Python?
Código relevante:
import subprocess as sp
data = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE).communicate()[0]
¿Debería hacer esto de otra manera?
Popen.communicate
establecerá el returncode
atributo cuando esté listo (*). 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).
Entonces puedes hacer (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 por la forma en que está implementado: después de configurar hilos para leer las transmisiones del niño, simplemente llama wait
.
.poll()
actualizará el código de retorno.
Intentar
child = sp.Popen(openRTSP + opts.split(), stdout=sp.PIPE)
returnCode = child.poll()
Además, después .poll()
de llamar, el código de retorno está disponible en el objeto como child.returncode
.
Sólo para señalar un error común: debes evitarlo Popen
siempre que puedas. Para citar la documentación,
El enfoque recomendado para invocar subprocesos es utilizar la
run()
función para todos los casos de uso que pueda manejar. Para casos de uso más avanzados, laPopen
interfaz subyacente se puede utilizar directamente.
Si solo desea ejecutar un subproceso y esperar a que finalice, esa es una sola línea de código con subprocess.run
sus hermanos heredados subprocess.call
y subprocess.check_output
y no necesita copiar/pegar ni comprender las complejidades de los métodos communicate
y etc necesarios. wait
alrededor del objeto de bajo nivel Popen
.
import subprocess
proc = subprocess.run(
[openRTSP] + opts.split(),
capture_output=True,
# avoid having to explicitly encode
text=True)
data = proc.stdout
result = proc.returncode
Si no desea capturar el resultado del proceso, tal vez reemplácelo capture_output=True
con stdout=subprocess.DEVNULL
(y tal vez de manera similar con stderr
); en ausencia de cualquiera de los dos, la salida simplemente se mostrará al usuario, fuera del control de Python.
Además, a menos que sus opciones opts
sean completamente triviales, generalmente reemplace la cadena normal split()
aquí con shlex.split()
la que entiende cómo lidiar con cadenas entre comillas.