如何让jq实时处理Python脚本输出的每个JSON对象?
解决jq延迟处理Python输出的问题
问题根源是Python的标准输出缓冲机制:当stdout指向管道(比如传给jq)时,Python默认会用「块缓冲」——也就是攒够一定量的数据才会把内容输出到管道里,而不是每执行一次print就立刻输出。所以jq要等Python脚本完全执行完,缓冲里的内容全部刷新出来后,才能开始处理。
下面是几种解决方法:
方法1:修改Python脚本,强制刷新输出
在print语句里加上flush=True参数,让每次print的内容立刻刷到stdout:
import json, time def new_json(n): frame = { "Iteration": n, "Field0": 0, "Field1": 1, "Field2": 2 } print(json.dumps(frame), flush=True) # 新增flush=True new_json(1) time.sleep(3) new_json(2) time.sleep(3) new_json(3)
修改后再运行python3 jqtest.py | jq .,就能看到jq每隔3秒输出格式化后的JSON。
方法2:运行Python时禁用缓冲
不用改脚本,直接给python命令加-u参数(unbuffered,无缓冲模式):
python3 -u jqtest.py | jq .
-u会让Python的stdout和stderr都变成无缓冲模式,输出会实时传递给jq。
方法3:通过环境变量禁用缓冲
设置PYTHONUNBUFFERED环境变量,效果和-u参数一致:
PYTHONUNBUFFERED=1 python3 jqtest.py | jq .
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

