没有通信需要避免子进程死锁

我需要一个执行一个命令来产生大量的输出,并且需要很多时间来执行(> 30分钟)。 我正在考虑使用subprocess.Popen来做到这一点。 我需要捕获命令的输出,所以我将PIPE传递给stdout和stderr。

使用Popen.wait()时遇到的死锁问题在很多论坛中都有详细记录,所以Popen.communicate()是避免死锁的建议方式。 该解决方案的问题是通信()阻塞,直到命令完成。 我需要打印执行命令时到达标准输出的所有内容。 如果20分钟后没有输出,脚本执行将被终止。

以下是我需要尊重的一些限制条件:

  • 我的Python版本是2.4.2,我无法升级。
  • 如果解决方案仍然使用子进程,我需要将subprocess.PIPE传递给所有std句柄以避免此错误:http://bugs.python.org/issue1124861
  • 有没有办法做到这一点?


  • 要在Python2.4上解决python bug#1124861,你可以将stdin附加到NUL设备上
  • import os
    from subprocess import PIPE, STDOUT, Popen
    
    lines = []
    p = Popen(cmd, bufsize=1, stdin=open(os.devnull), stdout=PIPE, stderr=STDOUT)
    for line in iter(p.stdout.readline, ''):
          print line,          # print to stdout immediately
          lines.append(line)   # capture for later
    p.stdout.close()
    p.wait()
    

    你有没有尝试过pexpect?


    这听起来像你需要对连接到管道的文件句柄进行非阻塞读取。

    这个问题解决了一些方法来做到这一点的Windows和Linux:非阻塞阅读在python subprocess.PIPE

    链接地址: http://www.djcxy.com/p/13477.html

    上一篇: Need to avoid subprocess deadlock without communicate

    下一篇: newbie python subprocess: "write error: Broken pipe"