我有一个写入stdout和stderr的程序。我想从python运行它,捕获stdout和stderr。我的代码如下:
from subprocess import *
p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()
对于几个程序,这很好用,但是当我添加一个新程序时,新的程序会永远挂起。如果我删除stdout=PIPE
,程序会将其输出写入控制台并完成,一切都很好。如何确定导致挂起的原因?
在Windows XP上使用python 2.5。程序不会从标准输入读取,也不会有任何用户输入(即“按键”)。
答案 0 :(得分:40)
当管道的缓冲区填满(通常大约4KB)时,写入过程将停止,直到读取过程读取了一些有问题的数据;但是在这里你没有读任何东西,直到子进程完成,因此死锁。 wait
communicate
确实非常清楚地说明了这一点:
警告如果是这将会死锁 子进程生成足够的输出 到这样的stdout或stderr管道 它阻止等待OS管道 缓冲区接受更多数据。使用 communication()以避免这种情况。
如果由于某种原因无法使用wait
,请让子进程写入临时文件,然后您可以{{1}}并在文件准备就绪时读取该文件 - 写入文件,而不是管道,不会有死锁的风险。
答案 1 :(得分:2)
看看docs。它声明你不应该使用wait,因为它可能导致死锁。尝试使用communicate。