0

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

我编写了一个 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++ 程序打印后尽快打印一行?

4

1 回答 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(其中print是语句,而不是函数),则可以直接刷新stdout缓冲区:

import sys

sys.stdout.flush()

默认情况下,stdout是行缓冲的,因此 python 通常应该在打印换行符时刷新缓冲区。

于 2013-01-30T10:03:15.273 回答