Получить код завершения из пакетного файла с использованием Python - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь получить код выхода из пакетного файла.Если быть более точным, у меня возникают проблемы с получением ОШИБКИ.

Я пытался использовать 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 = subrocess.PIPE из Popen, потому что он печатает все эхо из пакета.

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

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

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

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

Я заменяю:

EXIT /B !ERRORLEVEL!

на

EXIT 1

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

os.system(BatchFilePath) 

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

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

0 голосов
/ 25 октября 2018

Чтобы получить код возврата с помощью 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%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...