Код завершения процесса и переменная среды errorlevel не совпадают:
ant.bat:
if "%1"=="batch_fail" exit /B 1
if "%1"=="proc_fail" exit 1
>>> import subprocess
>>> subprocess.call(['ant.bat', 'batch_fail'])
0
>>> subprocess.call(['ant.bat', 'proc_fail'])
1
batch_fail установит уровень ошибки в 1, но он больше не доступен после выхода из оболочки.Однако proc_fail устанавливает код завершения процесса равным 1. Единственное решение, которое приходит на ум - это пакетный файл-обертка, который вызывает ant.bat и устанавливает код завершения процесса в соответствии с уровнем ошибки:
ant_wrapper.bat:
@echo off
call ant.bat %1
if errorlevel 1 exit 1
>>> subprocess.call(['ant_wrapper.bat'])
0
>>> subprocess.call(['ant_wrapper.bat', 'batch_fail'])
1
>>> subprocess.call(['ant_wrapper.bat', 'proc_fail'])
1
Редактировать:
Ваше обновление заставило меня задуматься об альтернативном подходе с использованием Popen.Вы можете запустить командный файл с помощью параметра / K команды cmd, который будет запускать команду без выхода.Затем просто отправьте exit %errorlevel%
через стандартный ввод и сообщите ():
#test errorlevel==1
>>> p = subprocess.Popen(['cmd', '/K', 'ant.bat', 'batch_fail'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> stdoutdata, stderrdata = p.communicate(b'exit %errorlevel%\r\n')
>>> p.returncode
1
#test errorlevel==0
>>> p = subprocess.Popen(['cmd', '/K', 'ant.bat'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> stdoutdata, stderrdata = p.communicate(b'exit %errorlevel%\r\n')
>>> p.returncode
0