Python Paho MQTT loop_forever()运行时如何实时重定向输出到文件?
解决Python MQTT脚本输出重定向后不实时写入文件的问题
问题原因
Python标准输出(stdout)默认在输出到终端时采用行缓冲(实时输出内容),但当重定向到文件时会切换为块缓冲模式——只有缓冲区被填满或程序退出时,才会将缓存的内容写入文件,这就是执行重定向命令后,只有中断脚本才会看到日志内容的原因。
解决方案
方法1:运行脚本时启用无缓冲模式(无需修改代码)
直接在运行命令中添加-u参数,强制Python禁用标准输出的缓冲机制:
python3 -u test_mqtt_client.py >> /tmp/test_mqtt_client.log
方法2:修改脚本中的print语句,强制刷新缓冲区
在每个print函数中添加flush=True参数,让每次输出后立即刷新缓冲区,确保内容实时写入文件:
修改后的关键代码片段如下:
# 连接Broker时的输出 print("connecting to broker", flush=True) # 订阅主题后的输出 for x in SUBSCRIBED_TOPICS: client.subscribe(x) print('Subscribed to topic "' + x + '".', flush=True) # 接收消息时的输出 def on_message(client, userdata, message): print("received message =", str(message.payload.decode("utf-8")), flush=True) # 其余文件写入代码保持不变...
方法3:在脚本开头全局配置无缓冲输出
在脚本最顶部导入sys模块,重新配置标准输出为行缓冲模式,全局生效:
import sys # 将标准输出设置为行缓冲,确保实时写入 sys.stdout = open(sys.stdout.fileno(), 'w', buffering=1) # 后续的模块导入和代码保持不变 import paho.mqtt.client as paho import ssl import random from config import BROKER_ADDRESS, PORT, CLIENT_CERT, CLIENT_KEY, CA_KEY, SUBSCRIBED_TOPICS, DEST_FOLDER
内容的提问来源于stack exchange,提问作者tirenweb
相关产品推荐
相关产品推荐

