AttributeError:“模块”对象没有属性“转储”

问题描述

对于一个项目,我在Python中使用ROS-MQTT桥。这是从ROS Wiki获得的库。 可以在以下位置找到该库:https://github.com/groove-x/mqtt_bridge

其中一个python文件(app.py)使用以下代码行:

# 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之后,我可以成功运行代码。