我有一些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
答案 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()