【问题标题】:How can I find out why subprocess.Popen wait() waits forever if stdout=PIPE?如果stdout = PIPE,我如何找出为什么subprocess.Popen wait() 永远等待?
【发布时间】:2010-11-29 13:25:06
【问题描述】:

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

from subprocess import *

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

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

在 Windows XP 上使用 python 2.5。该程序不会从标准输入读取数据,也没有任何类型的用户输入(即“按一个键”)。

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      当管道的缓冲区填满时(通常为 4KB 左右),写入过程停止,直到读取过程读取了一些有问题的数据;但是在这里,在子进程完成之前,您什么都没有读取,因此出现了死锁。 The docs on wait 确实说得很清楚:

      警告如果 子进程产生足够的输出 到 stdout 或 stderr 管道,这样 它阻塞等待操作系统管道 缓冲区以接受更多数据。采用 communicate() 来避免这种情况。

      如果由于某种原因您不能使用communicate,请让子进程写入一个临时文件,然后您可以wait 并在该文件准备好时读取该文件——写入一个文件,而不是一个管道,不会有死锁的风险。

      【讨论】:

      • 你比我略胜一筹。 +1
      • 使用 python 2.5 安装的帮助文件没有那么少的信息。谢谢
      猜你喜欢
      • 2019-08-13
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-06
      • 2010-12-02
      相关资源
      最近更新 更多