You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()回调把数据存入MySQL
  • client2:订阅另一个主题,用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协议传输的是字节流,库底层都是按字节处理的。
  • 但你手动创建的mockMQTTMessage对象,大概率是把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:24:57