我怎样才能找出原因如果stdout = PIPE subprocess.Popen的wait()等待下去吗?
-
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
和读取文件时,它已经准备好 - 写入文件,而不是一个管道,不风险死锁。
不隶属于 StackOverflow