Python中Paho.MQTT双客户端报错:TypeError需bytes-like对象而非str
问题分析:Paho MQTT中
TypeError: a bytes-like object is required, not 'str'错误根源 你的问题场景
你在Python里搭建了两个Paho.MQTT客户端连接Mosquitto代理:
client1:订阅了某主题,用loop_forever()持续运行,收到消息后通过on_message()回调把数据存入MySQLclient2:订阅另一个主题,用loop_start()启动后台循环,它的on_message()回调里用paho.mqtt.client.MQTTMessage这个mock对象做测试
当你用mosquitto_pub命令行给client2发消息时,测试能正常跑,但之后会弹出一堆报错,核心是这句:
TypeError: a bytes-like object is required, not 'str'
而且只要把client2里的mock测试代码注释掉,这个错误就彻底消失了。你现在疑惑:这个锅到底是Python的、Paho.MQTT库的,还是client1的loop_forever()方法的?
错误根源拆解
先给你结论:这个错误既和Python本身无关,也不是client1的loop_forever()导致的,问题出在你对MQTTMessage mock对象的使用上,触发了Paho.MQTT库内部的类型不兼容逻辑。
具体来说:
- 在Paho.MQTT的实际运行流程里,从代理接收到的消息主题(
message.topic)是bytes字节类型——毕竟MQTT协议传输的是字节流,库底层都是按字节处理的。 - 但你手动创建的mock
MQTTMessage对象,大概率是把topic设置成了普通的str字符串类型。当这个mock消息被传入库的消息匹配逻辑(也就是报错里的iter_match方法)时,方法里执行topic.split('/'),但字节类型的split需要传字节分隔符,而字符串类型的topic就会直接触发类型不匹配的报错。 - 为什么注释掉mock就没事?因为此时所有消息都是代理正常推送的、符合字节类型要求的消息,库的逻辑能顺畅处理,不会触发类型错误。
修复建议
你只需要检查并修正mockMQTTMessage的代码:
- 给
message.topic赋值时,一定要用字节类型,比如写成message.topic = b"your/test/topic",而不是"your/test/topic"。 - 如果你的测试逻辑里需要用字符串类型的topic,要么在mock初始化时就转成字节,要么在回调里先把字符串转成字节再处理。
这样调整后,mock测试能正常跑,也不会触发库内部的类型错误,client1的loop_forever()也能继续正常工作。
内容的提问来源于stack exchange,提问作者Bindu Manjunath
相关产品推荐
相关产品推荐

