cx_freeze之后的subprocess.Popen行为

时间:2014-06-10 21:58:29

标签: python python-3.x cx-freeze

我有一些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()来获取stdout / stderr

1 个答案:

答案 0 :(得分:2)

好的,我找到了解决方案。它看起来像是因为它的Windows GUI应用程序标准输出句柄不存在,看起来像子进程继承了该行为。因此,解决方法是一个简单的解决方案,一个更复杂的解决方案涉及win32api并为其创建管道(没有尝试此方法)。

这是最终奏效的内容:

startupinfo = subprocess.STARTUPINFO()
            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
            startupinfo.wShowWindow = subprocess.SW_HIDE
stdout_file = tempfile.NamedTemporaryFile(mode='r+', delete=False)
process = subprocess.Popen(['exe', 'arg1', 'arg2'], stdin=subprocess.PIPE, stdout=stdout_file, stderr=subprocess.PIPE, shell=False, startupinfo=startupinfo)
return_code = process.wait()
stdout_file.flush()
stdout_file.seek(0) # This is required to reset position to the start of the file
out = stdout_file.read()
stdout_file.close()