2009-09-18 112 views
16

我有一个程序写入标准输出并可能写入stderr。我想从python运行它,捕获stdout和stderr。我的代码如下所示:如何才能找出为什么subprocess.Popen等待()如果stdout = PIPE永远等待?

from subprocess import * 

p = Popen(exe, shell=TRUE, stdout=PIPE, stderr=PIPE) 
rtrncode = p.wait() 

的一对夫妇的程序,这工作得很好,但是当我加入一个新的,新的一个永远挂起。如果我删除stdout=PIPE,程序将其输出写入控制台并完成,并且一切都很好。我怎样才能确定是什么导致了挂起?

在Windows XP上使用python 2.5。该程序不从标准输入读取,也不具有任何用户输入(即“击中键”)。

回答

35

当管道缓冲区填满(通常为4KB左右)时,写入过程将停止,直到读取过程读取了一些有问题的数据;但是在这里你直到子过程完成才读取任何东西,因此造成了僵局。 The docswait说得非常清楚确实:

警告如果 子进程产生足够的输出 到标准输出或标准错误管道,使得 它会阻止等待操作系统管 缓冲区接受这将死锁更多数据。沟通()使用 来避免这种情况。

如果您不能使用communicate出于某种原因,有子写入到一个临时文件,然后你就可以wait和阅读文件时,它已经准备好 - 写入文件,而不是到管道,不会造成死锁。

+0

你打败了我。 +1 – MitMaro 2009-09-18 16:37:30

+0

使用python 2.5安装的帮助文件没有那么一点点的信息。谢谢 – 2009-09-18 17:07:12

+1

@Graeme啊,是的,2.6的文档大大改进了2.5。 – 2009-09-18 17:11:55

1

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