我需要一个执行命令,该命令会产生大量输出并需要很长时间才能执行(> 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
有办法吗?
最佳答案
- 解决方法python bug #1124861在 Python2.4 上,您可以将
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()
关于python - 需要避免没有通信的子进程死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5582933/