需要避免子进程死锁而不进行通信

GDI*_*der 22 python deadlock subprocess stdout pipe

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

使用Popen.wait()时的死锁问题已在很多论坛上得到充分记录,因此Popen.communicate()是避免死锁的建议方法.该解决方案的问题是communication()阻塞直到命令完成.我需要在执行命令时打印到达stdout的所有内容.如果20分钟后没有输出,脚本执行将被终止.

以下是我需要遵守的一些约束:

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

有办法吗?

jfs*_*jfs 12

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()
Run Code Online (Sandbox Code Playgroud)

  • @GDICommander:注意,代码可能会在[Wine](http://www.winehq.org/)下删除stderr.它在Ubuntu上运行正常.确保在Windows上进行测试. (2认同)

Zau*_*bov 6

你试过pexpect吗?