Python Popen 读取实时输出(Linux)
可能重复的问题:
逐行读取子进程的标准输出
我写了一个C++程序,它会在Linux控制台上生成一大堆文本。
我正在用一个Python脚本来解析这个C++程序的输出。我是这样做的:
cmd = ["./starter"]
p = subprocess.Popen(cmd,
stdout=subprocess.PIPE)
for line in p.stdout:
strLine = str(line).rstrip()
print(">>> " + strLine )
这个方法是有效的。但是我遇到了一个大问题,输出不是实时的。我的意思是,启动脚本后什么都不会打印出来,过了几秒钟才会有东西出来……这就像Python在等着收集一定数量的字符,然后一次性打印出来一样。
有没有办法让Python在C++程序打印出一行时,立刻就打印出来?
1 个回答
1
你正在使用 stdout
文件作为一个迭代器,这样会用到一个比较大的缓存,这就导致你的打印输出会有延迟。你可以试着用 .readline()
;这样你仍然可以用 iter()
和一个哨兵值来做循环:
for line in iter(p.stdout.readline, ''):
strLine = str(line).rstrip()
print(">>> " + strLine )
你也可以在调用打印函数时加上 flush=True
:
print(">>> " + strLine, flush=True)
或者,如果你用的是 Python 2 而不是 Python 3(在 Python 2 中,print
是一个语句,而不是一个函数),你可以直接刷新 stdout
的缓存:
import sys
sys.stdout.flush()
默认情况下,stdout
是按行缓存的,所以 Python 通常会在你打印换行符时刷新这个缓存。