问题描述
对于一个项目,我在Python中使用ROS-MQTT桥。这是从ROS Wiki获得的库。 可以在以下位置找到该库:https://github.com/groove-x/mqtt_bridge
# load serializer and deserializer
serializer = params.get ('serializer','json: dumps')
deserializer = params.get ('deserializer','json: loads')
运行roslaunch命令启动程序时,我收到以下错误,引用上面的代码:AttributeError: 'module' object has no attribute 'dumps'.
我看过this问题,但是答案对我的处境没有帮助。我在任何地方都找不到json.py文件,因此也无法重命名。如果我find sudo. -print | grep -i '. * [.] py'
只能得到以下文件:
./app.py
./__init__.py
./bridge.py
./util.py
./mqtt_client.py
对于那些感兴趣的人,追溯:
Traceback (most recent call last):
File "/opt/ros/melodic/lib/mqtt_bridge/mqtt_bridge_node.py",line 9,in <module>
mqtt_bridge_node ()
File "/opt/ros/melodic/lib/python2.7/dist-packages/mqtt_bridge/app.py",line 50,in mqtt_bridge_node
mqtt_client,serializer,deserializer,mqtt_private_path)
File "/opt/ros/melodic/lib/python2.7/dist-packages/mqtt_bridge/app.py",line 15,in create_config
serializer = lookup_object (serializer)
File "/opt/ros/melodic/lib/python2.7/dist-packages/mqtt_bridge/util.py",line 12,in lookup_object
obj = getattr (module,obj_name)
AttributeError: 'module' object has no attribute 'dumps'
对于对完整的app.py文件感兴趣的人:
# -*- coding: utf-8 -*-
from __future__ import absolute_import
import inject
import paho.mqtt.client as mqtt
import rospy
from .bridge import create_bridge
from .mqtt_client import create_private_path_extractor
from .util import lookup_object
def create_config(mqtt_client,mqtt_private_path):
if isinstance(serializer,basestring):
serializer = lookup_object(serializer)
if isinstance(deserializer,basestring):
deserializer = lookup_object(deserializer)
private_path_extractor = create_private_path_extractor(mqtt_private_path)
def config(binder):
binder.bind('serializer',serializer)
binder.bind('deserializer',deserializer)
binder.bind(mqtt.Client,mqtt_client)
binder.bind('mqtt_private_path_extractor',private_path_extractor)
return config
def mqtt_bridge_node():
# init node
rospy.init_node('mqtt_bridge_node')
# load parameters
params = rospy.get_param("~",{})
mqtt_params = params.pop("mqtt",{})
conn_params = mqtt_params.pop("connection")
mqtt_private_path = mqtt_params.pop("private_path","")
bridge_params = params.get("bridge",[])
# create mqtt client
mqtt_client_factory_name = rospy.get_param(
"~mqtt_client_factory",".mqtt_client:default_mqtt_client_factory")
mqtt_client_factory = lookup_object(mqtt_client_factory_name)
mqtt_client = mqtt_client_factory(mqtt_params)
# load serializer and deserializer
serializer = params.get('serializer','json:dumps')
deserializer = params.get('deserializer','json:loads')
# dependency injection
config = create_config(
mqtt_client,mqtt_private_path)
inject.configure(config)
# configure and connect to MQTT broker
mqtt_client.on_connect = _on_connect
mqtt_client.on_disconnect = _on_disconnect
mqtt_client.connect(**conn_params)
# configure bridges
bridges = []
for bridge_args in bridge_params:
bridges.append(create_bridge(**bridge_args))
# start MQTT loop
mqtt_client.loop_start()
# register shutdown callback and spin
rospy.on_shutdown(mqtt_client.disconnect)
rospy.on_shutdown(mqtt_client.loop_stop)
rospy.spin()
def _on_connect(client,userdata,flags,response_code):
rospy.loginfo('MQTT connected')
def _on_disconnect(client,response_code):
rospy.loginfo('MQTT disconnected')
__all__ = ['mqtt_bridge_node']
有人知道这个问题可能是什么吗?
解决方法
经过5个小时的尝试和研究,我发现缺少一个软件包依赖项。 该软件包正在检查缺少的依赖项,除了那个依赖项。
通过在其他文件中添加一些打印件,我发现缺少的不是json。这是一个称为msgpack的依赖项。
执行pip install msgpack-python==0.4.8
之后,我可以成功运行代码。