python如何从子进程的stdout中读取没有EOF的输出
问题出现的原因是在处理子进程的标准输出时,如果使用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()
函数来处理子进程的输出。