我怎样才能找出原因如果stdout = PIPE subprocess.Popen的wait()等待

2019-07-18 13:19发布

我有写到标准输出和标准错误可能的程序。 我想从蟒蛇运行,捕获输出和错误。 我的代码如下所示:

from subprocess import *

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

一对夫妇的程序,这工作得很好,但是当我加入一个新的,新的一个永远挂起。 如果我删除stdout=PIPE ,该程序的输出写入到控制台和装饰,一切都很好。 我怎么能确定是什么导致挂起?

在Windows XP上使用Python 2.5。 该程序不会从标准输入读取也不会有任何用户输入(即“命中关键”)。

Answer 1:

当管道缓冲区填满(通常4KB左右),写入过程停止,直到读出处理已阅读一些有问题的数据的; 但在这里,你正在阅读什么,直到子进程完成,因此僵局。 该文档在wait把它很清楚确实是:

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

如果您无法使用communicate出于某种原因,有子写入到一个临时文件,然后你就可以wait和读取文件时,它已经准备好-写入文件,而不是一个管道,不冒险僵局。



Answer 2:

看看该文档 。 它说,你不应该使用的等待,因为它可能会导致死锁。 尝试使用沟通 。



文章来源: How can I find out why subprocess.Popen wait() waits forever if stdout=PIPE?