python如何从子进程的stdout中读取没有EOF的输出

11 浏览
0 Comments

python如何从子进程的stdout中读取没有EOF的输出

我正在使用Python的subprocess.communicate()来读取一个大约运行一分钟的进程的stdout。

我想以流式方式打印该进程的每一行stdout,以便我能够在生成时看到输出,但仍然在进程终止之前阻塞。

subprocess.communicate()似乎一次性给出了所有输出。

0
0 Comments

问题出现的原因是在处理子进程的标准输出时,如果使用readline()read()函数读取数据,当子进程尚未终止时,这些函数会阻塞等待数据到达。因此,如果没有在循环中检查长度为0的情况,程序会一直阻塞,无法继续执行。

为了解决这个问题,可以通过在循环中使用readline()read()函数,并在每次读取数据后检查长度是否为0来判断是否到达文件结尾。如果长度为0,则表示子进程已经终止,可以退出循环。另外,为了减少最大内存使用量,可以将read()函数配合一个任意数值的参数来读取数据,而不是一次性读取整个管道的输出。

此外,shell=True在这里是多余的,应该被移除。如果移除了shell=True,则需要将命令以列表的形式传递给Popen函数。

下面是修正后的代码示例:

import sys
from subprocess import *
proc = Popen(['ls'], stdout=PIPE)
while True:
    data = proc.stdout.readline()
    if len(data) == 0:
        break
    sys.stdout.write(data)

这样,就可以以流的方式从子进程的标准输出中读取数据,而无需使用communicate()函数来处理子进程的输出。

0