python-未缓冲的子流程输出(最后一行缺失)

我必须忽略一些显而易见的事情.我需要执行一个C程序,实时显示其输出,最后解析其最后一行,这应该很简单,因为打印的最后一行总是相同的.

process = subprocess.Popen(args, shell = True,  
                           stdout = subprocess.PIPE, stderr = subprocess.PIPE)

# None indicates that the process hasn't terminated yet.
while process.poll() is None:

    # Always save the last non-emtpy line that was output by the child
    # process, as it will write an empty line when closing its stdout.
    out = process.stdout.readline()
    if out:
        last_non_empty_line = out

    if verbose:
        sys.stdout.write(out)   
        sys.stdout.flush()

# Parse 'out' here...

但是,有时不打印最后一行. Popens的bufsize的默认值为0,因此应该将其设置为无缓冲.我也尝试过,但在退出之前将fflush(stdout)添加到C代码中,但无济于事,但似乎绝对没有必要在退出程序之前刷新流.

有任何想法吗?

解决方法:

readline()必须缓冲文本,等待换行.

您将始终处于竞争状态-没有任何数量的未缓冲流将无法处理以下事实:正在处理一行,然后检查退出,然后读取一行,因此,如果子进程在处理一行时退出,您将不会阅读其他任何内容.另外,shell可能正在引入自己的缓冲.

因此,您可以:

>使用communication()并在子进程运行时放弃详细输出.
>确保退出过程后继续阅读,直到获得EOF.

我还建议更改您的代码,以便您不必使用shell = True.

上一篇:Python子进程使用超时终止


下一篇:管道传输时在python的子流程模块中使用stdout.close()