Windows下使用libusb出现"Error Accessing String"错误的解决方法
解决Windows下libusb无法获取USB设备字符串的问题
1. 替换设备驱动为libusb兼容版本
Windows自带的USB驱动(如WinUSB、HID类驱动)常限制libusb访问设备字符串描述符。需用工具将目标设备驱动替换为libusb支持的类型:
- 使用Zadig工具:选中目标USB设备,将驱动切换为
WinUSB、libusb-win32或libusbK。替换后,libusb即可正常读取设备字符串。- 注意:替换驱动可能导致设备原有功能暂时失效(如打印机、键盘),需恢复时可通过设备管理器操作。
2. 手动实现字符串描述符读取
默认print(dev)的内部逻辑未处理复杂权限场景,可手动调用API读取并增加错误捕获:
import libusb_package as libusb libusb.init() try: devices = libusb.find(find_all=True) for dev in devices: print(f"DEVICE ID {dev.idVendor:04x}:{dev.idProduct:04x} on Bus {dev.bus_number:03d} Address {dev.address:03d} ==================") # 读取厂商字符串 try: manufacturer = dev.get_string_descriptor(dev.iManufacturer, 100) print(f" iManufacturer : 0x{dev.iManufacturer:x} {manufacturer}") except Exception as e: print(f" iManufacturer : 0x{dev.iManufacturer:x} Failed: {str(e)}") # 读取产品字符串 try: product = dev.get_string_descriptor(dev.iProduct, 100) print(f" iProduct : 0x{dev.iProduct:x} {product}") except Exception as e: print(f" iProduct : 0x{dev.iProduct:x} Failed: {str(e)}") # 读取序列号字符串 try: serial = dev.get_string_descriptor(dev.iSerialNumber, 100) print(f" iSerialNumber : 0x{dev.iSerialNumber:x} {serial}") except Exception as e: print(f" iSerialNumber : 0x{dev.iSerialNumber:x} Failed: {str(e)}") finally: libusb.exit()
该方式能捕获具体错误,部分未替换驱动的设备也可能成功读取字符串。
3. 排查设备进程占用
若USB设备被其他应用(如自带管理软件)独占,libusb无法访问描述符:
- 关闭可能占用设备的程序后重试脚本。
- 通过Windows「资源监视器」查看占用设备的进程,结束对应进程后再运行代码。
4. 更新libusb-package至最新版
当前使用的1.0.26.2版本存在兼容性问题,更新到最新版可修复部分Windows权限相关bug:
pip install --upgrade libusb-package
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

