没有通信需要避免子进程死锁
我需要一个执行一个命令来产生大量的输出,并且需要很多时间来执行(> 30分钟)。 我正在考虑使用subprocess.Popen来做到这一点。 我需要捕获命令的输出,所以我将PIPE传递给stdout和stderr。
使用Popen.wait()时遇到的死锁问题在很多论坛中都有详细记录,所以Popen.communicate()是避免死锁的建议方式。 该解决方案的问题是通信()阻塞,直到命令完成。 我需要打印执行命令时到达标准输出的所有内容。 如果20分钟后没有输出,脚本执行将被终止。
以下是我需要尊重的一些限制条件:
有没有办法做到这一点?
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