如何实现C程序逐次输出并让Python实时读取其输出?
解决C程序实时输出与Python实时读取的问题
你的问题核心在于C标准输出的缓冲机制:当stdout指向管道(而非终端)时,printf默认采用全缓冲模式,只有缓冲区填满或程序退出时才会一次性输出所有内容,导致Python无法实时读取。
下面提供两种可行的修改方案:
方案1:修改C代码,手动刷新缓冲区
在每次printf后调用fflush(stdout)强制刷新输出缓冲区,确保内容实时输出:
修改后的test.c:
#include <stdio.h> #include <unistd.h> int main(){ int i; for(i = 1; i <= 10; i++){ sleep(5); printf("%d ",i); fflush(stdout); // 强制刷新缓冲区,立即输出内容 } return 0; }
编译命令保持不变:
gcc test.c -o test
方案2:不修改C代码,通过运行时参数禁用缓冲
如果你不想改动C代码,可以使用stdbuf工具修改程序的输出缓冲模式,修改Python脚本中的命令:
修改后的test.py:
#!/usr/bin/env python3 from subprocess import Popen, PIPE, CalledProcessError cmd = "stdbuf -o0 ./test" # -o0 表示标准输出无缓冲 print("Running..") with Popen(cmd, shell=True, stdout=PIPE, bufsize=1, universal_newlines=True) as p: for line in p.stdout: print(line, end='') if p.returncode != 0: raise CalledProcessError(p.returncode, p.args)
验证效果
无论采用哪种方案,运行Python脚本后,都会每隔5秒看到一个数字被实时打印出来,实现你想要的逐次输出与实时读取的效果。
内容的提问来源于stack exchange,提问作者Evan Krause
相关产品推荐
相关产品推荐

