实时获取另一个程序的输出作为输入

11 投票
6 回答
7972 浏览
提问于 2025-04-15 14:14

我有两个程序,使用方式是这样的:

$ c_program | python_program.py

c_program 用 printf() 打印一些内容,而 python_program.py 则用 sys.stdin.readline() 来读取这些内容。

我想让 python_program.py 能够在 c_program 打印的时候,立刻处理 c_program 的输出,这样它就可以及时打印自己的输出。不幸的是,python_program.py 只能在 c_program 结束后才能获取输入。

我该怎么解决这个问题呢?

6 个回答

7

如果你可以修改你的C程序,那你已经找到了答案。不过我想给那些不能或不想修改代码的人提供一个解决方案。

expect有一个示例脚本叫做unbuffer,这个脚本可以解决这个问题。

9

你需要在你的C程序中,每输出一行后都调用一下fflush(stdout)。比如,使用GNU的grep工具时,可以加上'--line-buffered'这个选项,这样就会实现这个效果。想了解更多,可以看看fflush的相关内容。

18

在你的C程序开始时(在进行任何输出之前),只需将标准输出设置为行缓冲,像这样:

#include <stdio.h>
setvbuf(stdout, NULL, _IOLBF, 0);

或者

#include <stdio.h>
setlinebuf(stdout);

这两种方法在Linux上都可以用,但setvbuf是C语言标准的一部分,所以它在更多系统上都能使用。

默认情况下,标准输出在管道或文件中是块缓冲,而在终端中是行缓冲。因为在这种情况下标准输出是一个管道,所以默认是块缓冲。如果是块缓冲,当缓冲区满了或者你调用fflush(stdout)时,缓冲区的内容才会被输出。如果是行缓冲,那么每输出一行就会自动刷新缓冲区。

撰写回答