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

StackOverflow https://stackoverflow.com/questions/1445627

  •  22-07-2019
  •  | 
  •  

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

from subprocess import *

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

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

在Windows XP使用Python 2.5。程序不会从stdin读也不具有任何种类的用户输入(即,“命中关键”)。

有帮助吗?

解决方案

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

  

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

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top