Python Popen读取实时输出(linux)

时间:2013-01-30 10:01:54

标签: python parsing popen

  

可能重复:
  read subprocess stdout line by line

我编写了一个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 个答案:

答案 0 :(得分: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通常应该在您打印换行符时刷新缓冲区。