¿Cómo obtener el código de salida cuando se utiliza el método de comunicación del subproceso de Python?

Resuelto CarpeNoctem asked hace 13 años • 8 respuestas

¿Cómo recupero el código de salida cuando uso subprocessel 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?

CarpeNoctem avatar Apr 12 '11 14:04 CarpeNoctem
Aceptado

Popen.communicateestablecerá el returncodeatributo 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.

Eli Bendersky avatar Apr 12 '2011 07:04 Eli Bendersky

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

Matthew Vernon avatar Aug 31 '2017 19:08 Matthew Vernon

Sólo para señalar un error común: debes evitarlo Popensiempre 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, la Popeninterfaz 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.runsus hermanos heredados subprocess.cally subprocess.check_outputy no necesita copiar/pegar ni comprender las complejidades de los métodos communicatey etc necesarios. waitalrededor 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=Truecon 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 optssean completamente triviales, generalmente reemplace la cadena normal split()aquí con shlex.split()la que entiende cómo lidiar con cadenas entre comillas.

tripleee avatar Feb 23 '2022 08:02 tripleee