我需要一个执行一个命令,产生大量的输出并需要大量的时间来执行(> 30分钟)。我正在考虑使用subprocess.Popen来做到这一点。我需要捕获命令的输出,所以我将PIPE传递给stdout和stderr。需要避免没有通信的子进程死锁
使用Popen.wait()时的死锁问题在许多论坛上都有很好的记录,所以Popen.communicate()是避免死锁的建议方式。该解决方案的问题是通信()阻塞,直到命令完成。我需要打印执行命令时到达标准输出的所有内容。如果20分钟后没有输出,脚本执行将被终止。
这里有一些限制,我需要尊重:
- 我的Python版本是2.4.2,我不能升级。
- 如果溶液仍然使用子,我需要通过subprocess.PIPE所有STD处理,以避免这个错误:http://bugs.python.org/issue1124861
有没有办法做到这一点?
(从谷歌即将?)所有管道就会死锁的喉管缓冲区的一个被填满而没有阅读。例如当stderr被填充时stdout死锁。切勿传递您不想阅读的PIPE。 – 2014-05-07 11:07:07