AttributeError: у объекта 'module' нет атрибута 'CAN_RAW' - PullRequest
0 голосов
/ 15 мая 2018

Я пишу простой скрипт на 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 и почему эта ошибка, спасибо!

1 Ответ

0 голосов
/ 15 мая 2018

Вы выбрали шину socketcan_native:

bustype = 'socketcan_native'

Однако, согласно документации интерфейса SocketCAN , вы не можете использовать эту опцию в Python2.7:

Существует две реализации бэкэндов socketcan.Один написан на ctypes для совместимости с Python 2 и 3, а другой написан для будущих версий Python3, которые имеют встроенную поддержку.

[...]

Если вы не используете Python3.3 или ниже рекомендуемый бэкэнд socketcan_native. Для Python2.7 и Python3 <3.4 доступный бэкэнд: <code>socketcan_ctypes.

Переключитесь на использование socketcan_ctypes:

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

или,и это намного лучше , используйте интерфейс socketcan;это запускает автоматическое определение правильного интерфейса для использования в вашей текущей системе.

Конкретная socket.CAN_RAW константа была добавлена ​​в Python 3.3, поэтому попытка использовать socketcan_native не удаласьнайти имя в Python 2.7.Для реализации socketcan_native также требуется socket.CAN_BCM, который был добавлен в Python 3.4.

...