28

我有一个写入标准输出和可能标准错误的程序。我想从 python 运行它,捕获标准输出和标准错误。我的代码如下所示:

from subprocess import *

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

对于几个程序,这很好用,但是当我添加一个新程序时,新程序会永远挂起。如果我删除stdout=PIPE,程序会将其输出写入控制台并完成,一切都很好。如何确定导致挂起的原因?

在 Windows XP 上使用 python 2.5。该程序不从标准输入读取,也没有任何类型的用户输入(即“按下键”)。

4

2 回答 2

51

当管道的缓冲区填满(通常为 4KB 左右)时,写入过程停止,直到读取过程读取了一些有问题的数据;但是在这里,在子进程完成之前,您什么都没有读取,因此出现了死锁。 上的文档wait确实非常清楚:

警告如果子进程向标准输出或标准错误管道生成足够的输出,从而阻塞等待操作系统管道缓冲区接受更多数据,这将死锁。使用communicate() 来避免这种情况。

如果由于某种原因您不能使用communicate,请让子进程写入临时文件,然后您可以wait在准备好时读取该文件——写入文件而不是管道,不会有死锁的风险。

于 2009-09-18T16:36:04.630 回答
3

看看文档。它指出您不应该使用等待,因为它会导致死锁。尝试使用通信

于 2009-09-18T16:37:11.413 回答