我似乎没有从Windows上的subprocess.call获取正确的退出代码.
import subprocess
exit_code = subprocess.call(['ant.bat', 'fail'])
print exit_code # prints 0
Run Code Online (Sandbox Code Playgroud)
在Windows上做同样的事情似乎返回0以外的东西
> echo %errorlevel%
0
> ant fail
> echo %errorlevel%
1
Run Code Online (Sandbox Code Playgroud)
两个调用的值不应该给出相同的值吗?难道我做错了什么?
在最坏的情况下,如何在我的python脚本中检查%errorlevel%的值?
更新:
我试过这样的东西来获取errorlevel值:
environment = os.environment.copy()
cmd = subprocess.Popen(['ant.bat', 'fail'], env = environment)
for key, value in environment.items():
print '%s = %s' % (key, value)
Run Code Online (Sandbox Code Playgroud)
但是我没有在该字典中看到errorlevel(os.getenv ['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
Run Code Online (Sandbox Code Playgroud)
batch_fail会将errorlevel设置为1,但在shell退出后不再可用.但是,proc_fail将进程退出代码设置为1.想到的唯一解决方案是一个包装批处理文件,它调用ant.bat并根据errorlevel设置进程退出代码:
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
Run Code Online (Sandbox Code Playgroud)
编辑:
您的更新让我想到了使用Popen的替代方法.您可以通过cmd/K选项运行批处理文件,该选项将运行命令而不退出.然后只需exit %errorlevel%通过stdin 发送,并传递():
#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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3471 次 |
| 最近记录: |