我是 python 新手,并尝试在 Windows 中从 python 运行 exe 软件。
我写了以下代码:
from subprocess import STDOUT, Popen, PIPE
cmd=r'C:\Users\lenaq\Desktop\sep\WATv16\TLWMA-0.09.exe'
with open('test.log', 'w') as f:
p = subprocess.Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
for c in iter(lambda: p.stdout.read(1), ''):
sys.stdout.write(c)
f.write(c)
exe程序有一些运行错误,我需要获取程序的输出来修复params文件以防止错误。
问题是,通过使用上面的代码,我没有得到 exe 的完整输出(与 os.system() 命令相比)。输出写入还没完成就弹出exe的错误信息窗口,不知道问题出在哪里。
你能帮我么...
stderr=PIPE
将错误流重定向到p.stderr
,并且您没有阅读该内容(请注意,使用p.communicate
允许获取两个流结果,但单独读取它们可能会导致死锁)。
无论如何,如果您不关心合并 out 和 err 流,您可以将其更改为:
stderr=STDOUT
所以 out 和 err 使用相同的流p.stdout
另外:不要使用shell=True
,你不需要它。
如果这不能解决您的情况,则意味着底层程序在未刷新其输出时崩溃了。当输出未重定向时,输出刷新的工作方式有所不同,这可以解释为什么在不使用重定向的情况下运行它时会获得更多输出os.system
(有关此问题的更多信息:强制程序在重定向时刷新其标准输出)
尚未探索的一个线索是使用winpty
这相当于unbuffer
在 Windows 上:Windows 上的 unbuffer 程序相当于什么?。就像是:
cmd = ["winpty.exe","-Xallow-non-tty","-Xplain","TLWMA-0.09.exe"]
p = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)