【问题标题】:Cannot get exit code when running subprocesses in python using Popen and start /wait使用 Popen 在 python 中运行子进程并启动 /wait 时无法获取退出代码
【发布时间】:2018-10-23 05:21:06
【问题描述】:

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

这段代码总结了问题:

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% 它看起来是正确的,所以我不确定我做错了什么

【问题讨论】:

  • @OferSadan 我已更新代码以删除不必要的导入,但问题仍然存在
  • 我已经尝试用两种类型的导入来复制它,我得到了和你一样的结果,所以为这个错误道歉

标签: python windows command-line popen exit-code


【解决方案1】:

使用

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

resultCode 中返回错误代码 1 而不是您的 start /wait

按这个问答的逻辑:CALL command vs. START with /WAIT option

我的猜测是,不同之处在于 start /wait 不与同一环境共享变量,而 call 共享。

【讨论】:

  • 谢谢,但我正在寻找一种解决方案,可以打开一个单独的命令行窗口,使用 CALL 时不会发生这种情况
【解决方案2】:

如果 CMD 的start 命令通过CreateProcessShellExecuteEx 成功执行给定命令,则它总能成功。即使它被指示为/wait 并最终将%errorlevel% 设置为非零值,它也会成功。你可以通过运行(start /wait exit 1) && echo success 看到这一点。 && 运算符仅在左侧表达式成功时才执行右侧表达式。

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

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 参数,因为需要使用/v:on 选项手动运行shell。这可以使用“!”延迟扩展环境变量而不是“%”。

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

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

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 2014-08-24
    • 2011-08-03
    • 2021-03-17
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多