首页 > 解决方案 > AttributeError:“模块”对象没有属性“CAN_RAW”

问题描述

我正在编写一个简单的 python 脚本来从 CAN 总线读取数据。我将 python_can 库用于 python 2.7。它包含一个名为 CANopenNode 的类,在我编写的 __init_ 方法中:

self.bus = can.interface.Bus(channel = 'can0', bustype = 'socketcan_native')

当我运行代码时,它会报告如下错误:

File "/home/jxu/.local/lib/python2.7/site-packages/can/interface.py", line 87, in __new__
return cls(channel, **kwargs)
File "/home/jxu/.local/lib/python2.7/site-packages/can/interfaces/socketcan/socketcan_native.py", line 416, in __init__
self.socket = create_socket(CAN_RAW)
File "/home/jxu/.local/lib/python2.7/site-packages/can/interfaces/socketcan/socketcan_native.py", line 305, in create_socket
if can_protocol is None or can_protocol == socket.CAN_RAW:
AttributeError: 'module' object has no attribute 'CAN_RAW'

create_socket(库内部)中的相关代码行如下所示:

if can_protocol is None or can_protocol == socket.CAN_RAW:
    can_protocol = socket.CAN_RAW
    socket_type = socket.SOCK_RAW
elif can_protocol == socket.CAN_BCM:
    can_protocol = socket.CAN_BCM
    socket_type = socket.SOCK_DGRAM
sock = socket.socket(socket.PF_CAN, socket_type, can_protocol)

库文件似乎没有错:

>>> import socket
>>> print socket.__file__
/usr/lib/python2.7/socket.pyc

谁能解释一下 CAN_RAW 的含义以及为什么会出现此错误,谢谢!

标签: python-2.7can-bus

解决方案


您选择了socketcan_native公共汽车:

bustype = 'socketcan_native'

但是,根据SocketCAN接口文档,您不能在 Python 2.7 上使用该选项:

socketcan 后端有两种实现。一种是用 ctypes 编写的,以兼容 Python 2 和 3,另一种是为 Python3 的未来版本编写的,具有原生支持。

[...]

除非您运行的是 Python3.3 或更低版本,否则推荐的后端是socketcan_native. 对于 Python2.7 和 Python3 <3.4,可用的后端是socketcan_ctypes.

切换到使用socketcan_ctypes

self.bus = can.interface.Bus(channel = 'can0', bustype = 'socketcan_ctypes')

或者,这要好得多,使用socketcan界面;这会触发自动检测用于当前系统的正确接口。

在 Python 3.3 中添加了特定的socket.CAN_RAW常量,这就是为什么在 Python 2.7 中尝试使用socketcan_native无法找到名称的原因。该socketcan_native实现也需要socket.CAN_BCM可用,它是在 Python 3.4 中添加的。


推荐阅读