使用Popen和start/wait在python中运行子进程时无法获取退出代码
我试图创建一个python脚本,它启动一个新窗口并等待它完成,然后检索退出代码。因此,我使用带有使用Popen和start/wait在python中运行子进程时无法获取退出代码,python,windows,command-line,popen,exit-code,Python,Windows,Command Line,Popen,Exit Code,我试图创建一个python脚本,它启动一个新窗口并等待它完成,然后检索退出代码。因此,我使用带有start/wait的Popen为它创建一个单独的窗口,但这并不能正确地转发退出代码 此代码总结了问题: import subprocess params = {} params['stdout'] = subprocess.PIPE params['stderr'] = subprocess.PIPE params['shell'] = True proc = subprocess.Popen(
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%
时,它看起来是正确的,所以我不确定我使用
proc = subprocess.Popen('call cmd /c exit 1', **params)
而不是start/wait
返回resultCode
中的错误代码1
根据这个问题和答案的逻辑:
我的猜测是,不同之处在于
start/wait
与call
不共享相同环境中的变量。CMD的start
命令如果通过CreateProcess
或ShellExecuteEx
成功执行给定命令,则总的来说总是成功的。即使指令它执行/wait
并最终将%errorlevel%
设置为非零值,它也会成功。通过运行(启动/等待退出1)和&echo success
可以看到这一点。如果左侧表达式成功,则&&
运算符仅执行右侧表达式
要解决这个问题,您可以使用手动退出初始shell!错误等级代码>由start
设置的值。例如:
command='exit 1'
shell_path=os.environ.get('ComSpec','cmd.exe')
start_命令='start”“/wait{}'。格式(命令)
cmdline=“{shell}”/v:on/c”({command})&exit!errorlevel!”。格式(
shell=shell\u路径,命令=start\u命令)
proc=subprocess.Popen(cmdline,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
请注意,上面的Popen
调用没有使用shell=True
参数,因为shell需要使用/v:on
选项手动运行。这允许使用“!”而不是“%”延迟扩展环境变量
也就是说,你不需要为你的既定目标提供外壳。只需让子进程通过传递create\u new\u console
creation标志来创建一个新控制台,如下所示:
proc=subprocess.Popen(args,creationflags=subprocess.CREATE\u NEW\u控制台,
stdout=subprocess.PIPE,stderr=subprocess.PIPE)
@OferSadan我已经更新了代码以删除不必要的导入和问题持续存在我尝试用这两种导入复制它,我得到了与您相同的结果,因此对错误表示歉意谢谢,但我正在寻找一种解决方案,它可以打开一个单独的命令行窗口,在使用CALL时不会发生这种情况