Python调用USB设备遇USBError: [Errno 13]权限不足,配置udev规则仍未解决
解决USBError: [Errno 13] Access denied权限问题
我来帮你梳理下这个权限问题——你已经找对了方向用udev规则赋权,但规则没生效大概率是语法或者重载步骤出了问题,结合你的环境信息,给你几个具体的排查和修复步骤:
1. 修复udev规则的语法问题
你当前的规则用了SYSFS{},这是旧版udev的废弃语法(现代Linux发行版多基于systemd,已经不再推荐使用),替换成ATTRS{}并加上USB子系统限定,才能被正确识别。
把你的/etc/udev/rules.d/99-usbftdi.rules修改为:
# 匹配目标USB设备(Vendor 0x0683, Product 0x4108) SUBSYSTEM=="usb", ATTRS{idVendor}=="0683", ATTRS{idProduct}=="4108", MODE="0666", GROUP="plugdev"
MODE="0666":给所有用户读写权限,最直接解决权限问题GROUP="plugdev":把设备归属到plugdev组(如果你的用户在这个组里,也可以只给组权限,更安全)
2. 正确重载udev规则并触发设备事件
修改完规则后,必须让udev重新加载规则,否则新规则不会生效:
sudo udevadm control --reload-rules sudo udevadm trigger
然后拔插你的USB设备,让新规则应用到设备上。
3. 验证规则是否生效
执行以下命令确认设备权限是否更新:
# 先通过lsusb找到设备的总线号和设备号,比如Bus 001 Device 005 lsusb | grep 0683:4108 # 查看对应设备的权限 ls -l /dev/bus/usb/[总线号]/[设备号]
如果权限显示crw-rw-rw-,说明规则生效;如果还是crw-rw----,说明规则没匹配到目标设备。
4. 排查规则匹配问题
如果权限仍不对,用udevadm查看设备的详细属性,确认规则是否能正确匹配:
# 替换成你的设备路径,比如/dev/bus/usb/001/005 udevadm info -a -p $(udevadm info -q path -n /dev/bus/usb/001/005)
在输出里找到idVendor和idProduct的属性,确认它们的值确实是0683和4108,并且处于SUBSYSTEM=="usb"的层级下。
5. 临时验证方案(确认是权限问题)
如果以上步骤都做完还是不行,先确认是不是其他问题:
- 用
sudo python your_script.py运行测试代码,如果能正常执行,说明确实是普通用户权限不足的问题 - 检查你的用户是否在plugdev组:
groups your_username,如果不在,执行sudo usermod -aG plugdev your_username,然后重新登录生效
补充你的环境信息(方便其他开发者参考)
- Python版本:
Python 2.7.12 (default, Dec 4 2017, 14:50:18) - pyusb版本:
usb.__version__ '1.0.2' - 错误栈:
Traceback (most recent call last): File "/media/psf/Home/All-Projects-on-femto/LaserLab/Software/usb_4108.py", line 19, in <module> dev.set_configuration() File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 869, in set_configuration self._ctx.managed_set_configuration(self, configuration) File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 102, in wrapper return f(self, *args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 147, in managed_set_configuration self.managed_open() File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 102, in wrapper return f(self, *args, **kwargs) File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 120, in managed_open self.handle = self.backend.open_device(self.dev) File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 786, in open_device return _DeviceHandle(dev) File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 643, in __init__ _check(_lib.libusb_open(self.devid, byref(self.handle))) File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 595, in _check raise USBError(_strerror(ret), ret, _libusb_errno[ret]) USBError: [Errno 13] Access denied (insufficient permissions)
- 原udev规则:
# For FTDI FT232 & FT245 USB devices with Vendor ID = 0x0403, Product ID = 0xabc SYSFS{idProduct}=="4108", SYSFS{idVendor}=="0683", RUN+="/sbin/modprobe -q ftdi-sio product=0x4108 vendor=0x0683" #SYSFS{idProduct}=="2450", SYSFS{idVendor}=="0683", RUN+="/sbin/modprobe -q ftdi-sio product=0x2450 vendor=0x0683" SYSFS{idVendor}=="0683", SYSFS{idProduct}=="4108", MODE="0666"
- 测试代码:
import usb.core import usb.util dev = usb.core.find(idVendor=0x0683, idProduct=0x4108) dev.reset()
内容的提问来源于stack exchange,提问作者Valentyn
相关产品推荐
相关产品推荐

