gpt4 book ai didi

python - 调用 Windows 脚本时 python 中的退出代码不正确

转载 作者:可可西里 更新时间:2023-11-01 13:24:19 24 4
gpt4 key购买 nike

我似乎没有从 Windows 上的 subprocess.call 获得正确的退出代码。

import subprocess
exit_code = subprocess.call(['ant.bat', 'fail'])
print exit_code # prints 0

在 Windows 上做同样的事情似乎返回了 0 以外的东西

> echo %errorlevel%
0
> ant fail
> echo %errorlevel%
1

两次调用的值不应该给出相同的值吗?我做错了什么吗?

在最坏的情况下,如何在我的 python 脚本中检查 %errorlevel% 的值?

更新:

我试过这样的方法来获取错误级别值:

environment = os.environment.copy()
cmd = subprocess.Popen(['ant.bat', 'fail'], env = environment)
for key, value in environment.items():
print '%s = %s' % (key, value)

但是我在该字典中没有看到错误级别(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

batch_fail 会将错误级别设置为 1,但在 shell 退出后该级别将不再可用。然而,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 的替代方法。您可以通过 cmd 的/K 选项运行批处理文件,这将在不退出的情况下运行命令。然后简单地通过标准输入发送 exit %errorlevel% 和 communicate():

#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

关于python - 调用 Windows 脚本时 python 中的退出代码不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6637468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com