Получить код выхода из пакетного файла с помощью Python

Я пытаюсь получить код выхода из Batch-файла. Чтобы быть более конкретным, у меня возникают проблемы с получением ERRORLEVEL.

Я попытался использовать Popen, check_output, call, check_call:

   out = os.system(BatchFilePath)
   out, err = subprocess.Popen(BatchFilePath,stderr=subprocess.PIPE, shell=True).communicate()
   out,err = subprocess.Popen(BatchFilePath, stderr=subprocess.PIPE).communicate()
   out = subprocess.Popen(BatchFilePath,  shell=True).stderr
   out = os.system(BatchFilePath)
   out = subprocess.check_call(BatchFilePath)
   out = subprocess.call(BatchFilePath, shell=True)
   out = subprocess.check_output(buildPath, shell=True)

В большинстве случаев возврат пуст или 0

Я также попытался использовать

SET ERRORLEVEL=1
exit /B !ERRORLEVEL!

но без везения. Я также пробовал

    set RC=
    setlocal
    somecommand.exe
    endlocal & set RC=%ERRORLEVEL%
    exit /B %RC%

В противном случае это сделать

out, err = subprocess.Popen(BatchFilePath,stdout=subrocess.PIPE,stderr=subprocess.PIPE, shell=True).communicate()

и поиск строки «ERROR» или «FAILURE» из переменной out.

С другой стороны, при этом пользователь не будет видеть все эхо из командного файла, поэтому экран будет пуст без сообщений до окончания пакетного файла и распечатает соответствующее сообщение из моего сценария python.

Поэтому мне не нужно использовать параметр stdout = subprocess.PIPE из Popen, потому что он печатает все эхо из партии.

Я работаю с CMD, а не с PowerShell. и я использую python 2.7

Я искал в google и здесь, и я не смог найти что-нибудь, что поможет мне. Любая помощь будет оценена.

Всего 2 ответа


Чтобы получить код возврата с помощью subprocess.Popen используйте метод poll() или wait() .

Вот пример использования poll() :

proc = subprocess.Popen('ls')
proc.communicate()
retcode = proc.poll()

Документация здесь: https://docs.python.org/2/library/subprocess.html#subprocess.Popen.poll

В соответствии с вашим комментарием я проверил, используя ваш пакетный скрипт

SET ERRORLEVEL=1
exit /B !ERRORLEVEL!

Он будет работать, если вы замените ! с %

SET ERRORLEVEL=1
exit /B %ERRORLEVEL%

Решение моей проблемы было действительно простым, но довольно нервным.

Я заменяю:

EXIT /B !ERRORLEVEL!

с

EXIT 1

и я использовал

os.system(BatchFilePath) 

над всем остальным.

Спасибо @olricson, за то, что нашли время, чтобы помочь мне. Я ценю это.


Есть идеи?

10000