跨Windows/macOS/Linux用Python检测USB键盘断开的pyusb问题求解
pyusb报错修复方法
你遇到的entity not found错误核心原因是使用了pyusb已废弃的旧API,配合以下步骤即可修复:
- 第一步:替换废弃API。
usb.busses()是pyusb 0.x版本的接口,目前主流的1.x版本已经移除该接口,替换为usb.core.find系列接口即可。 - 第二步:修正libusb动态库放置路径。将
libusb-1.0.dll放到C:\Windows\System32目录下(64位系统),32位系统放到C:\Windows\SysWOW64目录,避免因Python环境路径配置问题导致库加载失败。 - 第三步:执行脚本时用管理员权限启动终端/编辑器,Windows下访问底层USB设备需要系统级权限,无权限调用也会触发实体找不到报错。
修复后的测试代码如下:
import usb.core # 遍历所有USB设备,输出VID和PID for dev in usb.core.find(find_all=True): print(f"设备VID: {hex(dev.idVendor)}, 设备PID: {hex(dev.idProduct)}")
运行后找到你目标键盘的VID和PID记录下来,后续轮询时直接指定ID查询即可,不用遍历所有设备:
# 替换为你自己键盘的VID、PID TARGET_VID = 0x1234 TARGET_PID = 0x5678 dev = usb.core.find(idVendor=TARGET_VID, idProduct=TARGET_PID) if dev is None: print("键盘已断开,执行自定义操作") # 此处添加熄屏等自定义逻辑
跨平台USB设备监听替代方案
pyusb方案需要处理各系统的驱动权限问题,Windows下部分默认使用系统HID驱动的键盘无法直接被pyusb识别,推荐使用更稳定的系统原生API适配方案,无需修改设备驱动:
轮询方案(实现简单,兼容性强)
各平台使用对应原生接口枚举输入设备,对比目标设备是否存在:
- Windows:使用
wmi库枚举键盘设备,先执行pip install wmi
import wmi c = wmi.WMI() target_kb_id = "你的键盘设备ID,首次运行遍历所有键盘即可获取" is_connected = any(kb.DeviceID == target_kb_id for kb in c.Win32_Keyboard())
- Linux:直接读取
/proc/bus/input/devices文件过滤目标键盘,或者用pyudev库枚举设备 - Mac:调用
ioreg命令枚举HID设备,过滤目标键盘信息
事件监听方案(无需轮询,实时触发)
不想做周期性轮询的可以用各平台的设备插拔事件回调机制:
- Windows:通过
pywin32监听WM_DEVICECHANGE系统消息 - Linux:用
pyudev监听udev的设备插拔事件 - Mac:用IOKit框架监听USB设备匹配通知
各平台熄屏触发命令可直接用os.system调用:
- Windows:
os.system("rundll32.exe user32.dll,LockWorkStation")或者第三方工具nircmd.exe monitor off - Linux:
os.system("xset dpms force off") - Mac:
os.system("pmset displaysleepnow")
内容的提问来源于stack exchange,提问作者Darren Oakey
相关产品推荐
相关产品推荐

