15

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

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

它挂在第三行,只有当我将它作为 python 脚本运行并且我无法在 python shell 中重现它时。

另一个脚本只打印了几个字,我假设这不是缓冲区问题。

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

4

3 回答 3

5

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

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

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

于 2013-01-21T06:59:37.357 回答
0

您可以在下一个来源中看到如何处理挂起的 stdout/stderr 读取:

阅读过程

于 2019-03-23T16:20:51.863 回答
0

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

你可以:

  • 等待子进程终止,然后 read() 将返回。
  • 如果您的输出被分成几行,请使用 readline() (如果没有输出行,仍然会挂起)。
  • 使用 os.read(F,N) 从 F 中返回最多 N 个字节,但如果管道为空,仍然会阻塞(除非在 fd 上设置了 O_NONBLOCK)。
于 2017-11-14T23:54:02.990 回答