如何无缓冲将两个Python脚本的实时输出导入单个程序的stdin
解决同时无缓冲合并两个持续输出脚本的问题
要实现两个持续生成数据的Python脚本(image-output.py和text-output.py)无缓冲地同时向process-data.py输入数据,你可以试试下面几种可靠的方案,避开cat带来的缓冲或阻塞问题:
方法1:使用命名管道(最稳定的方案)
命名管道(FIFO)允许多个进程同时写入,且能保证数据实时流向读取进程,完美适配你的持续输出场景:
- 创建命名管道:
mkfifo data_pipe
- 后台运行两个输出脚本,无缓冲写入管道:
# 启动图像输出脚本,后台运行并写入管道 unbuffer ./image-output.py > data_pipe & # 启动文本输出脚本,后台运行并写入管道 unbuffer ./text-output.py > data_pipe &
- 让处理脚本从管道读取数据:
./process-data.py < data_pipe
处理完成后,记得删除临时管道:
rm data_pipe
方法2:使用Bash进程替换合并流
如果你不想创建临时文件,可以用Bash的进程替换功能,直接将两个无缓冲输出合并到process-data.py的标准输入:
cat <(unbuffer ./image-output.py) <(unbuffer ./text-output.py) | ./process-data.py
这里的<(...)会把每个脚本的输出当作一个临时流,cat会同时读取这两个流并实时输出(注:部分环境下cat可能有轻微缓冲,但对于持续输出的场景,通常能满足实时性需求)。
方法3:使用GNU Parallel工具
如果你安装了parallel(大部分Linux发行版可通过包管理器安装),可以用它并行运行两个脚本并合并无缓冲输出:
parallel -j2 --ungroup unbuffer {} ::: ./image-output.py ./text-output.py | ./process-data.py
-j2:表示同时运行2个任务--ungroup:禁用输出缓冲,确保数据实时传递::::后面跟要并行运行的脚本列表
关键注意事项
- 确保缓冲真的被禁用:Python脚本输出到管道时默认会用块缓冲,
unbuffer会强制改为行缓冲/无缓冲;你也可以在Python脚本内部手动设置,比如print(data, flush=True),这样可以不用依赖unbuffer。 - 处理输出交错:因为两个脚本并行运行,它们的输出可能会交错(比如图像数据行和文本数据行混合),如果
process-data.py需要区分数据类型,建议在输出里加标识前缀,让处理脚本能识别分类。
内容的提问来源于stack exchange,提问作者bjubes
相关产品推荐
相关产品推荐

