当exe失败时,python popen sdtout不会得到所有的输出

我是新来的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)