¿Por qué a veces el subproceso de Python no pudo obtener el código de salida correcto después de ejecutar un proceso?

Estoy utilizando el subproceso Python para ejecutar scripts externos en Windows 7. Estoy intentando obtener el código de salida.


En el caso 1, ejecuto un script de python test1.py .

test1.py

 import sys sys.exit(24) <--exit code 

myscript1.py

 import subprocess process = subprocess.Popen(["python", "C:\\path\\to\\test1.py"], stdout=subprocess.PIPE) process.wait() print process.returncode 

En el símbolo del sistema de Windows, cuando ejecuto el script, obtengo el siguiente resultado:

 >python test1.py > >echo %errorlevel% >24 > >python myscript1.py >24 

Por lo tanto, puede ver que el subproceso puede obtener el código de salida correcto en este caso.


En el caso 2, ejecuto un archivo por lotes test2.cmd .

prueba2.cmd

 EXIT /B 56 <--exit code 

myscript2.py

 import subprocess process = subprocess.Popen(["C:\\path\\to\\test2.cmd"], stdout=subprocess.PIPE) process.wait() print process.returncode 

En el símbolo del sistema de Windows, cuando ejecuto el script, obtengo el siguiente resultado:

 >test2.cmd > >echo %errorlevel% >56 > >python myscript2.py >56 

Por lo tanto, puede ver que el subproceso también puede obtener el código de salida correcto en este caso.


En el caso 3, ejecuto un script SikuliX .

test3.sikuli

 xxx xxx (sikuli script here) xxx xxx ... exit(16) <--exit code 

myscript3.py

 import subprocess process = subprocess.Popen(["C:\\path\\to\\runsikuli.cmd", "-r", "C:\\path\\to\\sikuli-script.sikuli"], stdout=subprocess.PIPE) process.wait() print process.returncode 

En el símbolo del sistema de Windows, cuando ejecuto el script, obtengo el siguiente resultado:

 >C:\path\to\runsikuli.cmd -r C:\path\to\sikuli-script.sikuli >... (stdout + stderr) >16 > >echo %errorlevel% >16 > >python myscript3.py >0 

En el caso 3, cuando ejecuto el script manualmente en el símbolo del sistema, puede establecer el% errorlevel%. Cuando ejecuto el script utilizando el subproceso Python, el subproceso no puede obtener el código de salida correcto. Siempre devuelve 0.

¿Por qué el subproceso de Python no pudo obtener el código de salida en el caso 3?

Como dice su comentario, si ejecuta el mismo comando , tanto el símbolo del sistema como el módulo de subprocess Python producen el mismo resultado (0 código de salida).

Es posible que veas diferentes códigos de salida porque usas diferentes comandos. No hay sorpresa aquí. El módulo de subprocess Python devuelve el código de salida correcto (para un comando dado).


Si no devuelve el estado de salida correcto, entonces puede agregar & exit al final de su comando cmd.exe como una solución para obtener el código de retorno correcto, consulte “subproceso en Windows: código de retorno incorrecto con shell = True” en Rastreador de problemas de Python:

 from subprocess import check_call check_call(r'C:\path\to\runsikuli.cmd -r C:\path\to\sikuli-script.sikuli & exit', shell=True) 

Aunque esto no responde la pregunta directamente, puede usar este método para obtener el código de salida indirectamente en el subproceso Python.

Crear un archivo por lotes batch.cmd . En el archivo, llame al comando que desea ejecutar así:

 call %1 -r %2 EXIT /B %errorlevel% 

En su script de python:

 import subprocess exitcode = subprocess.call(r'C:\path\to\batch.cmd C:\path\to\runsikuli.cmd C:\path\to\sikuli-script.sikuli', shell=True) print "Exit Code = "+str(exitcode)