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

标签 python subprocess pipe stdout deadlock

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

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

以下是我需要遵守的一些限制:

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

有办法吗?

最佳答案

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()

关于python - 需要避免没有通信的子进程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5582933/

相关文章:

python - 错误 : Package: python-devel-2. 6.6-64.el6.x86_64 需要 : python-libs(x86-64) = 2. 6.6-64.el6 找到 : python-libs-2. 6.6-66.el6_8.x86_64

python - python subprocess 模块的动态输出

python - Python3 'subprocess.check_output' 中的“cleartool find -print”返回空字符串

bash - nohup 和 sed,重定向 stderr 和 stdout

c++ - 从 .exe 读取输入并写入 .exe 以读取国际象棋引擎命令

python - 如何使用注释返回多个值?

python - scipy p 值返回 0.0

python - 列表和元组之间的连接/分布

python:为什么用子进程调用 echo 会返回 WindowsError 2?

linux - 为什么挂起的 SSH 命令等待来自服务器上两端都打开的管道的输出 'sshd'?