我怎样才能找出为什么subprocess.Popen wait()如果stdout = PIPE会永远等待?

Gra*_*row 20 python subprocess

我有一个程序写入stdout和stderr.我想从python运行它,捕获stdout和stderr.我的代码看起来像:

from subprocess import *

p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()
Run Code Online (Sandbox Code Playgroud)

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

在Windows XP上使用python 2.5.该程序不从stdin读取,也没有任何类型的用户输入(即"按键").

Ale*_*lli 42

当管道的缓冲区填满(通常大约4KB)时,写入过程将停止,直到读取过程读取了一些有问题的数据; 但是在这里你没有读任何东西,直到子进程完成,因此死锁. 该文档wait说得非常明确地确:

警告如果子进程生成足够的输出到stdout或stderr管道,这将阻塞等待OS管道缓冲区接受更多数据,这将导致死锁.使用communic()来避免这种情况.

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