我是新来的python,并试图从Windows中运行一个exe软件从python。 我写了下面的代码:
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的错误消息窗口在输出写入完成之前popup,我不知道问题出在哪里。
你能帮我么…
stderr=PIPE
将错误流重定向到p.stderr
,而你没有阅读(请注意,使用p.communicate
可以获得两个流结果,但单独读取它们可能会导致死锁)。
无论如何,如果你不关心合并出错流,你可以改变:
stderr=STDOUT
所以无论是否使用相同的流p.stdout
另外:不要使用shell=True
,你不需要它。
如果这不能解决你的情况,这意味着底层程序崩溃,而不是刷新其输出。 当输出不重定向时,输出刷新的工作方式不同,这可能解释了为什么在不使用os.system
重定向的情况下运行时会得到更多的输出(关于此问题的更多信息: 强制程序在重定向时刷新其标准输出 )
尚未探索的一个主要问题是使用winpty
,它相当于Windows上的非winpty
:在Windows 上,相当于unbuffer的程序是什么? 。 就像是:
cmd = ["winpty.exe","-Xallow-non-tty","-Xplain","TLWMA-0.09.exe"] p = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)