Почему иногда подпроцесс Python не смог получить правильный код выхода после запуска процесса?

Я использую подпроцесс Python для запуска внешних скриптов в Windows 7. Я пытаюсь получить код выхода.


В случае 1 я запускаю скрипт 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 

В командной строке Windows при запуске скрипта я получаю следующий вывод:

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

Таким образом, вы можете видеть, что подпроцесс может получить правильный код выхода в этом случае.


В случае 2 я запускаю пакетный файл test2.cmd .

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

В командной строке Windows при запуске скрипта я получаю следующий вывод:

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

Таким образом, вы можете видеть, что подпроцесс также может получить правильный код выхода в этом случае.


В случае 3 я запускаю скрипт 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 

В командной строке Windows при запуске скрипта я получаю следующий вывод:

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

В случае 3, когда я запускаю скрипт вручную в командной строке, он может установить% errorlevel%. Когда я запускаю скрипт с использованием подпроцесса Python, подпроцесс не может получить правильный код выхода. Он всегда возвращает 0.

Почему подпроцесс Python не смог получить код выхода в случае 3?

Как говорится в вашем комментарии, если вы запускаете ту же команду, то и командная строка, и модуль subprocess Python выдают тот же результат (0 код выхода).

Вы можете видеть разные коды выхода, потому что вы используете разные команды. Не удивительно. Модуль subprocess Python возвращает правильный код выхода (для данной команды).


Если он не возвращает правильный статус выхода, вы можете добавить & exit в конце вашей команды cmd.exe в качестве обходного пути для получения правильного кода возврата, см. «Подпроцесс в Windows: неправильный код возврата с оболочкой = True» на Трекер ошибок Python:

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

Хотя это не отвечает на вопрос напрямую, вы можете использовать этот метод, чтобы косвенно получить код выхода в подпроцессе Python.

Создайте пакетный файл batch.cmd . В файле вызовите команду, которую вы хотите выполнить следующим образом:

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

В вашем скрипте 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)