python-2.7 - 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 的含义以及为什么会出现此错误,谢谢!
解决方案
您选择了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 中添加的。
推荐阅读
- mongodb - 猫鼬中的“无法识别的表达式`$regexMatch`”
- javascript - 在 react-select 中提供 inputValue 道具后无法从列表中选择值
- rust - 如何在 Rust 中调用具有可变自身的结构上的方法
- python - 带女服务员的 Python Dash 服务器
- excel - 交叉引用 2 个不同的列,然后将值计数放在另一个表中
- excel - 如何在电源查询(Excel 或 Power BI)中获取最近 4 周的日期
- wordpress - 在 wordpress plus elementor 中创建带有帖子标题和网站徽标的动态特色图像
- java - 为 Spring Boot Controller 调用的特定方法设置超时
- excel - Excel 下拉框可以作为带有多选复选框的列表框吗?
- java - Java:根据数组大小设置不同的对象字段