Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Popen和start/wait在python中运行子进程时无法获取退出代码_Python_Windows_Command Line_Popen_Exit Code - Fatal编程技术网

使用Popen和start/wait在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(

我试图创建一个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%
时,它看起来是正确的,所以我不确定我使用

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时不会发生这种情况