PyUSB可获取idVendor/idProduct但dev返回None问题求助
解决PyUSB的usb.core.find()返回None的问题
针对你能获取到设备的idVendor(34148/0x8564)和idProduct(4096/0x1000)但usb.core.find()返回None的问题,按以下步骤排查:
1. 确认参数格式与调用方式
检查find()的参数是否正确传递,PyUSB支持十进制或十六进制的vid/pid值,两种写法都有效,需确保无拼写错误:
# 十进制写法 dev = usb.core.find(idVendor=34148, idProduct=4096) # 十六进制写法(与设备管理器显示格式一致,更常用) dev = usb.core.find(idVendor=0x8564, idProduct=0x1000)
如果设备连接在特定总线或地址,可指定参数缩小查找范围:
# 先遍历所有设备获取bus和address for device in usb.core.find(find_all=True): print(f"Bus: {device.bus}, Address: {device.address}, VID: {device.idVendor}, PID: {device.idProduct}") # 再用bus和address精准查找 dev = usb.core.find(bus=xxx, address=xxx)
2. 解决权限问题(Linux/macOS)
Linux和macOS下普通用户默认无USB设备访问权限,会导致find()返回None:
- Linux:创建udev规则文件(如
/etc/udev/rules.d/50-usb-device.rules),添加内容:
重新加载udev规则并触发生效:SUBSYSTEM=="usb", ATTRS{idVendor}=="8564", ATTRS{idProduct}=="1000", MODE="0666"
拔插设备后重新运行代码。sudo udevadm control --reload-rules sudo udevadm trigger - macOS:可临时用
sudo运行Python脚本,或通过系统权限设置给当前用户分配USB设备访问权限。
3. 解除内核驱动占用(Linux/Windows)
如果设备被系统内核驱动占用,PyUSB无法获取设备控制权:
- Linux:先查看设备绑定的驱动模块:
解除绑定(以usb-storage驱动为例):lsusb -t
例如总线号为1、设备号为5,执行echo -n "总线号-设备号" | sudo tee /sys/bus/usb/drivers/usb-storage/unbindecho -n "1-5" | sudo tee /sys/bus/usb/drivers/usb-storage/unbind。 - Windows:打开设备管理器,找到目标USB设备,右键选择「更新驱动程序」→「浏览我的计算机以查找驱动程序」→「让我从计算机上的可用驱动程序列表中选取」,选择
libusb-win32或WinUSB驱动(需提前用驱动替换工具配置)。
4. 验证设备是否真的存在
运行以下代码遍历所有USB设备,确认目标vid/pid的设备是否在系统识别列表中:
import usb.core import usb.util for device in usb.core.find(find_all=True): try: print(f"VID: {device.idVendor} (0x{device.idVendor:04x}), PID: {device.idProduct} (0x{device.idProduct:04x})") print(f"设备名称: {usb.util.get_string(device, device.iProduct)}") except: # 跳过无法读取字符串的设备异常 continue
如果列表中没有目标设备,说明设备未正确连接或系统未识别。
内容的提问来源于stack exchange,提问作者user20030253
相关产品推荐
相关产品推荐

