如果stdout=PIPE,如何找出subprocess.Popen wait()永远等待的原因?

2024-05-14 00:09:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

from subprocess import *

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

对于一些程序来说,这很好,但是当我添加一个新的程序时,新的程序将永远挂起。如果删除stdout=PIPE,程序会将其输出写入控制台并完成,一切正常。我怎样才能确定是什么导致了绞刑?

在WindowsXP上使用Python2.5。程序既没有从stdin中读取,也没有任何用户输入(即“击键”)。


Tags: 代码fromimport程序truestderrstdoutshell
2条回答

当管道的缓冲区填满(通常为4KB左右)时,写入进程会停止,直到读取进程读取了一些有问题的数据;但是在这里,在完成子进程之前,您不会读取任何内容,因此会出现死锁。The docs关于wait说得非常清楚:

Warning This will deadlock if the child process generates enough output to a stdout or stderr pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate() to avoid that.

如果由于某种原因无法使用communicate,请让子进程写入临时文件,然后可以wait并在文件准备就绪时读取该文件——写入文件而不是管道不会导致死锁。

看看docs。它指出你不应该使用wait,因为它会导致死锁。尝试使用communicate

相关问题 更多 >