You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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. 准备工作

  • 安装pyusbpip 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

火山引擎 最新活动