Python Popen()。stdout.read()挂起

时间:2013-01-21 06:55:59

标签: python subprocess stdout popen hang

我正在尝试输出另一个脚本,使用Python的subprocess.Popen,如下所示

process = Popen(command, stdout=PIPE, shell=True)
exitcode = process.wait()
output = process.stdout.read()   # hangs here

它挂在第三行,只有当我把它作为python脚本运行时才能在python shell中重现它。

另一个脚本只打印几个单词,我假设它不是缓冲区问题。

有没有人知道我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

您可能希望使用.communicate()而不是.wait().read()。请注意wait()文档页面上有关subprocess的警告:

  

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

http://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait

答案 1 :(得分:0)

read()在返回之前等待EOF。

你可以:

  • 等待子进程死掉,然后read()将返回。
  • 如果您的输出被分成几行,则使用readline()(如果没有输出行,则仍然会挂起)。
  • 使用os.read(F,N)从F返回最多N个字节,但如果管道为空,仍会阻塞(除非在fd上设置了O_NONBLOCK)。

答案 2 :(得分:0)

您可以在下一个资源中看到如何处理stdout / stderr的吊读:

readingproc