【发布时间】:2014-06-10 21:58:28
【问题描述】:
我有一些 python 代码使用 subprocess.Popen 打开控制台应用程序并从中获取 stdout/stderr。
从解释器启动工作正常且符合预期。
在使用带有--base-name Win32GUI 选项的 cx_freeze 后,Popen 现在会在控制台窗口中弹出,我无法捕获 stdout/stderr。如果我删除 --base-name Win32GUI 它会按预期工作,但我现在在 UI 后面有一个控制台。
这里是代码(我试过没有startupinfo和没有shell=False):
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startupinfo.wShowWindow = subprocess.SW_HIDE
subprocess.Popen(['exe', 'arg1', 'arg2'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, startupinfo=startupinfo)
我正在使用out, err = p.communicate() 来获取标准输出/标准错误
【问题讨论】:
-
尝试给它
stdin=subprocess.PIPE,即使你不想发送任何标准输入。 This page 建议您需要为其提供所有三个标准流的句柄。 -
这似乎可行,但现在
p.communicate()正在为out返回NoneType(错误仍然有效)。 -
很奇怪。如果你给它
stderr=subprocess.STDOUT来合并它们会发生什么? -
您应该将
Popen调用放在try语句中,并在引发异常时记录到文件中。 -
如果您从命令提示符运行 exe,它可能继承了进程标准句柄的错误控制台缓冲区句柄。
Popen将在无效句柄上调用DuplicateHandle时死掉。尝试以start my.exe运行它。start命令在进程CreationFlags中设置CREATE_NEW_CONSOLE,所以无效句柄不会被复制到GUI进程中。
标签: python python-3.x cx-freeze