Почему иногда подпроцесс 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?

2 Solutions collect form web for “Почему иногда подпроцесс Python не смог получить правильный код выхода после запуска процесса?”

Как говорится в вашем комментарии, если вы запускаете ту же команду, то и командная строка, и модуль 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) 
  • Python: перейдите в каталог переносных устройств (Windows 7)
  • Невозможно открыть virtualenv на WIndows
  • Открытие потока Python в новом окне консоли
  • Python - получить значения датчиков и скорости вращения вентиляторов - Windows 10
  • Как распространять предварительно скомпилированные модули расширения для Windows на pypi для нескольких версий Python?
  • Как открыть файл для редактирования из командной строки под Windows?
  • Панель задач Windows (Windows 7?) - как установить имя приложения в диалоговом окне уведомлений панели управления
  • Как запустить процесс daemon из python на windows?
  • Python - лучший язык программирования в мире.