Python Popen 读取实时输出(Linux)

0 投票
1 回答
1890 浏览
提问于 2025-04-17 14:10

可能重复的问题:
逐行读取子进程的标准输出

我写了一个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 通常会在你打印换行符时刷新这个缓存。

撰写回答