gpt4 book ai didi

python - 使用 Popen 和启动/等待在 python 中运行子进程时无法获取退出代码

转载 作者:行者123 更新时间:2023-12-01 09:26:53 33 4
gpt4 key购买 nike

我正在尝试创建一个 python 脚本,该脚本启动一个新窗口并等待它完成,然后检索退出代码。因此,我使用 Popen 和 start/wait 为其创建一个单独的窗口,但这并不能正确转发退出代码。

此代码总结了问题:

import subprocess

params = {}
params['stdout'] = subprocess.PIPE
params['stderr'] = subprocess.PIPE
params['shell'] = True

proc = subprocess.Popen('start /wait cmd /c exit 1', **params)

# This works but the above line does not
#proc = subprocess.Popen('exit 1', **params)

resultCode = proc.wait()

print(resultCode)

start/wait 的文档建议它应该返回退出代码,当我手动运行它然后检查 %ERRORLEVEL% 它看起来是正确的,所以我不确定我做错了什么

最佳答案

CMD start如果通过 CreateProcess 成功执行给定命令,则命令总体上总是成功或ShellExecuteEx 。即使指示 /wait 它也会成功。并最终设置 %errorlevel%为非零值。您可以通过运行 (start /wait exit 1) && echo success 来看到这一点。 &&如果左侧表达式成功,则运算符仅执行右侧表达式。

要解决此问题,您可以使用 !errorlevel! 手动退出初始 shell。由 start 设置的值。例如:

command = 'exit 1'
shell_path = os.environ.get('ComSpec', 'cmd.exe')
start_command = 'start "" /wait {}'.format(command)
cmdline = '"{shell}" /v:on /c "({command}) & exit !errorlevel!"'.format(
shell=shell_path, command=start_command)

proc = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

请注意上面的Popen调用不使用shell=True参数,因为 shell 需要使用 /v:on 手动运行选项。这可以使用“!”延迟扩展环境变量。而不是“%”。

也就是说,您不需要 shell 来实现您既定的目标。只需让子进程通过传递 CREATE_NEW_CONSOLE 创建一个新控制台即可。创建标志如下:

proc = subprocess.Popen(args, creationflags=subprocess.CREATE_NEW_CONSOLE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)

关于python - 使用 Popen 和启动/等待在 python 中运行子进程时无法获取退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50315227/

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