我怎样才能找出为什么subprocess.Popen wait()如果stdout = PIPE会永远等待?

时间:2009-09-18 16:30:59

标签: python subprocess

我有一个写入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。程序不会从标准输入读取,也不会有任何用户输入(即“按键”)。

2 个答案:

答案 0 :(得分:40)

当管道的缓冲区填满(通常大约4KB)时,写入过程将停止,直到读取过程读取了一些有问题的数据;但是在这里你没有读任何东西,直到子进程完成,因此死锁。 wait communicate确实非常清楚地说明了这一点:

  

警告如果是这将会死锁   子进程生成足够的输出   到这样的stdout或stderr管道   它阻止等待OS管道   缓冲区接受更多数据。使用   communication()以避免这种情况。

如果由于某种原因无法使用wait,请让子进程写入临时文件,然后您可以{{1}}并在文件准备就绪时读取该文件 - 写入文件,而不是管道,不会有死锁的风险。

答案 1 :(得分:2)

看看docs。它声明你不应该使用wait,因为它可能导致死锁。尝试使用communicate