代码之家  ›  专栏  ›  技术社区  ›  Graeme Perrow

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

  •  17
  • Graeme Perrow  · 技术社区  · 16 年前

    我有一个程序,可以写入stdout和stderr。我想从python运行它,捕获stdout和stderr。我的代码如下所示:

    from subprocess import *
    
    p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
    rtrncode = p.wait()
    

    stdout=PIPE

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

    2 回复  |  直到 16 年前
        1
  •  51
  •   Alex Martelli    16 年前

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

    警告 如果 子进程生成足够的输出 至标准管道或标准管道,以便 它会阻止等待操作系统管道 缓冲区以接受更多数据。使用 沟通()以避免这种情况。

    communicate 出于某种原因,让子流程写入一个临时文件,然后就可以了 等待 并在文件准备就绪时读取它——写入文件而不是管道不会有死锁的风险。

        2
  •  3
  •   MitMaro    16 年前

    看一看 docs . 它声明您不应该使用wait,因为它可能导致死锁。试用 communicate .