如何使用Python重置Windows系统下的USB 3相机设备?
解决USB 3相机重置问题的Python方案
嘿,我来帮你搞定这个USB相机频繁断连后快速重置的问题!你之前用pywinusb找不到相机是因为大多数USB相机属于USB视频类(UVC)设备,不是HID人机交互设备,所以HID扫描工具自然搜不到它们。下面给你两个简单可行的方案,都能自动遍历并重置相机:
方案一:用Windows自带的devcon工具(推荐,简单易上手)
devcon是Windows自带的命令行设备管理工具,能直接重启指定的USB设备,不需要额外安装复杂的库。步骤如下:
1. 先获取相机的硬件ID
- 打开「设备管理器」,找到你的USB相机(通常在「照相机」或「通用串行总线设备」分类下)
- 右键相机→「属性」→「详细信息」→下拉菜单选「硬件ID」,你会看到类似
USB\VID_XXXX&PID_YYYY的字符串,这就是设备的唯一标识
2. Python脚本实现批量重置
我们可以用subprocess模块调用devcon命令,先枚举所有UVC设备的硬件ID,再逐个重启。代码示例:
import subprocess import re def get_uvc_device_ids(): # 调用devcon列出所有USB设备,过滤出UVC相机的硬件ID result = subprocess.run( ["devcon", "find", "USB\\*"], capture_output=True, text=True, check=True ) # 用正则匹配硬件ID(格式:USB\VID_XXXX&PID_YYYY&...) pattern = re.compile(r"USB\\VID_[0-9A-Fa-f]+&PID_[0-9A-Fa-f]+") return list(set(pattern.findall(result.stdout))) def reset_usb_device(device_id): try: # 重启指定设备,需要管理员权限 subprocess.run( ["devcon", "restart", device_id], check=True, capture_output=True, text=True ) print(f"✅ 成功重置设备: {device_id}") except subprocess.CalledProcessError as e: print(f"❌ 重置设备失败 {device_id}: {e.stderr}") if __name__ == "__main__": print("正在扫描USB相机设备...") uvc_devices = get_uvc_device_ids() if not uvc_devices: print("未找到任何USB相机设备") else: print(f"找到 {len(uvc_devices)} 台相机,开始重置...") for dev_id in uvc_devices: reset_usb_device(dev_id)
注意事项
- 必须以管理员身份运行脚本,否则
devcon没有权限操作设备 - 如果系统找不到
devcon,可以从Windows SDK获取,或者直接搜索下载适合你系统版本的devcon.exe,放到脚本同目录或者添加到系统PATH里
方案二:纯Python实现(用pyusb库)
如果你不想依赖外部工具,可以用pyusb直接操作USB设备,不过需要额外安装驱动:
1. 准备工作
- 安装
pyusb:pip install pyusb - 安装libusb-win32驱动:用Zadig工具给你的USB相机安装libusb驱动(否则Windows会阻止直接访问设备)
2. Python脚本实现
import usb.core import usb.util def reset_uvc_cameras(): # 枚举所有USB设备,过滤出UVC类设备(视频控制接口类为0x0E) cameras = [] for device in usb.core.find(find_all=True): try: # 检查设备是否有UVC视频控制接口 for cfg in device: for intf in cfg: if intf.bInterfaceClass == 0x0E: # 0x0E是视频控制类 cameras.append(device) break else: continue break except Exception as e: # 跳过无权限或无法访问的设备 continue if not cameras: print("未找到任何USB相机设备") return print(f"找到 {len(cameras)} 台相机,开始重置...") for cam in cameras: try: # 获取设备的VID和PID用于标识 vid_pid = f"VID_{cam.idVendor:04X}&PID_{cam.idProduct:04X}" cam.reset() print(f"✅ 成功重置设备: {vid_pid}") except usb.core.USBError as e: print(f"❌ 重置设备失败 {vid_pid}: {str(e)}") if __name__ == "__main__": reset_uvc_cameras()
注意事项
- 同样需要管理员权限运行脚本
- 如果遇到权限错误,确保已经用Zadig给相机安装了libusb驱动
最后肯定你的需求:遍历所有相机逐个重置完全可行,上面两个方案都能实现。优先推荐方案一,因为不需要额外装驱动,操作更简单!
内容的提问来源于stack exchange,提问作者Danny Taffari




