动态获取另一个程序的输出作为输入

And*_*mbu 10 c python linux bash stdio

我有两个以这种方式使用的程序:

$ c_program | python_program.py
Run Code Online (Sandbox Code Playgroud)

c_program使用printf()和python_program.py读取打印的东西sys.stdin.readline()

我想立即打印python_program.py进程c_program的输出,以便它可以打印自己的当前输出.不幸的是,python_program.py仅在c_program结束后获取其输入.

我怎么解决这个问题?

mar*_*k4o 17

只需将stdout设置为在C程序开始时进行行缓冲(在执行任何输出之前),如下所示:

#include <stdio.h>
setvbuf(stdout, NULL, _IOLBF, 0);
Run Code Online (Sandbox Code Playgroud)

要么

#include <stdio.h>
setlinebuf(stdout);
Run Code Online (Sandbox Code Playgroud)

任何一个都可以在Linux上运行,但它setvbuf是C标准的一部分,因此它可以在更多系统上运行.

默认情况下,stdout将为管道或文件进行块缓冲,或者为终端缓冲行.由于在这种情况下stdout是管道,因此默认将是块缓冲.如果它是块缓冲的,那么当缓冲区已满或者调用时将刷新缓冲区fflush(stdout).如果它是行缓冲的,那么它将在每行之后自动刷新.


bri*_*gge 8

你需要的是你的C程序在每一行之后调用fflush(stdout).例如,使用GNU grep工具,您可以调用选项'--line-buffered',这会导致此行为.见fflush.


nic*_*bot 7

如果你可以修改你的C程序,你已经收到了你的答案,但我想我会为那些不能/不会修改代码的人提供一个解决方案.

expect有一个名为unbuffer的示例脚本可以解决问题.