【问题标题】:Python Popen to read live output (linux) [duplicate]Python Popen 读取实时输出(linux)[重复]
【发布时间】:2013-01-14 02:27:21
【问题描述】:

可能重复:
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++ 程序打印出一行后立即打印它?

【问题讨论】:

    标签: python parsing popen


    【解决方案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 通常应该在你打印换行符时刷新缓冲区。

    【讨论】:

    • 通过添加冲洗它做同样的事情
    • 那么你的 C++ 程序输出也被缓冲了。
    • @Johny19:啊,不,我知道还有什么问题。已更新。
    • 我还在我的 C++ 中使用了 fflush(stdout)。但即使没有它,直接启动 C++ 时控制台中的输出也很快且流畅
    • @Johny19:是的,已经更新了答案;迭代 p.stdout 时需要避免涉及读取缓冲区。
    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2013-05-20
    相关资源
    最近更新 更多