Python读取无终止管道连续数据流的问题
解决Python读取持续管道数据流无输出的问题
这个坑我之前踩过!你遇到的问题核心是Python的标准输出缓冲策略搞的鬼:当print输出到终端时,默认是行缓冲——每打一行就立刻把内容刷到屏幕;但当输出被重定向到管道(也就是你的|场景)时,Python会切换成块缓冲,只有当缓冲区填满(通常是4KB左右)或者程序终止时,才会把缓冲的内容发送到管道里。你的data_stream.py一直在循环输出单行小内容,缓冲区永远填不满,所以read_data.py根本拿不到数据。
下面给你三个实用的解决方案,按优先级排序:
1. 修改数据源,强制刷新输出
直接在data_stream.py的print语句里加上flush=True参数,让每次输出都立刻刷新缓冲区:
import time i = 0 while True: print(i, flush=True) # 关键:强制刷新输出缓冲 i += 1 time.sleep(2)
修改后再运行python3 data_stream.py | python3 read_data.py,就能看到read_data.py实时打印每一行数字了。
如果你不想改print语句,也可以手动调用sys.stdout.flush():
import time import sys i = 0 while True: print(i) sys.stdout.flush() # 手动刷新缓冲 i += 1 time.sleep(2)
2. 用-u参数运行数据源程序
如果不想修改代码,可以在运行data_stream.py时加上-u参数,强制Python使用无缓冲的标准输出:
python3 -u data_stream.py | python3 read_data.py
这个参数会让print的内容直接写入管道,跳过缓冲逻辑,效果和方案1一样。
3. 调整读取端的读取方式(不推荐)
你也可以修改read_data.py,主动从标准输入逐字符读取,而不是依赖行迭代(但这种方式代码更复杂,没必要优先用):
import sys while True: char = sys.stdin.read(1) if not char: break print(char, end='')
不过这个方案需要处理换行符,而且效率不如前两个,所以更推荐前两种直接解决缓冲的方法。
内容的提问来源于stack exchange,提问作者Konstantin
相关产品推荐
相关产品推荐

