python subprocess.Popen挂起

时间:2016-09-13 18:45:30

标签: python subprocess

            child = subprocess.Popen(command,
                         shell=True,
                         env=environment,
                         close_fds=True,
                         stdout=subprocess.PIPE,
                         stderr=subprocess.STDOUT,
                         bufsize=1,
                                     )

            subout = ""
            with child.stdout:
                for line in iter(child.stdout.readline, b''):
                    subout += line
            logging.info(subout)
            rc = child.wait()

有些时候(间歇性地),这种情况永远存在。 不确定它是挂在iter(child.stdout.readline)还是child.wait()

ps -ef进行Popens进程并且该进程不再存在

我的猜测是它与bufsize有关,所以child.stdout.readline永远在进行,但我不知道如何测试它,因为这是间歇性的发生

我可以实现警报,但我不确定这是否合适,因为我无法确定popen'd进程是缓慢还是悬挂

让我们假设child.stdout.readline或wait()永远挂起,除了闹钟之外我还可以采取什么行动?

2 个答案:

答案 0 :(得分:7)

你可能会遇到explained in the documentation

的僵局
  

Popen.wait()

     

等待子进程终止。设置并返回returncode属性。

     

警告:使用stdout=PIPE和/或stderr=PIPE时会发生死锁,并且子进程会为管道生成足够的输出,以阻止等待操作系统管道缓冲区接受更多数据。使用communicate()来避免这种情况。

解决方案是使用Popen.communicate()

答案 1 :(得分:1)

close_fds=True添加到对subprocess.Popen()的呼叫中,如here所述。