You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

容器内Python脚本无法实时更新USB设备状态的技术求助

容器内USB设备插拔检测不实时更新的解决方法

问题分析

容器内运行Python脚本检测USB设备时,移除设备后状态仍显示已插入、仅重启脚本才刷新,核心原因有两点:

  • pyusb的usb.core.find()默认会缓存设备列表,不会主动刷新
  • 容器未正确挂载udev相关资源,无法实时获取设备状态变化

解决方案

1. 强制刷新pyusb设备缓存

修改检测函数,在调用usb.core.find()时添加refresh=True参数,强制每次查询都刷新设备列表:

import usb

# 替换为你的设备ID
VENDOR_ID = 0xXXXX
PRODUCT_ID = 0xXXXX

def detect_device():
    # 添加refresh=True强制刷新设备缓存
    dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID, refresh=True)
    if dev is None:
        print("No device found")
        return False
    else:
        print("USB device found")
        return True

while True:
    print(detect_device())

2. 改用pyudev监听设备事件(更可靠)

pyusb轮询效率低且依赖缓存,改用pyudev监听udev的设备添加/移除事件,能实时响应状态变化:

import pyudev

# 替换为你的设备ID(字符串格式)
VENDOR_ID = "XXXX"
PRODUCT_ID = "XXXX"

context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')

def check_device_status():
    devices = context.list_devices(subsystem='usb', ID_VENDOR_ID=VENDOR_ID, ID_MODEL_ID=PRODUCT_ID)
    return any(devices)

# 先输出初始状态
print("USB device found" if check_device_status() else "No device found")

# 监听设备事件
for action, device in monitor:
    if device.get('ID_VENDOR_ID') == VENDOR_ID and device.get('ID_MODEL_ID') == PRODUCT_ID:
        if action == 'add':
            print("USB device inserted")
        elif action == 'remove':
            print("USB device removed")

3. 确保容器拥有足够权限和正确挂载

启动容器时,需要挂载udev运行目录并赋予必要权限,否则容器无法获取设备变化:

docker run -it --privileged -v /run/udev:/run/udev:ro -v /dev/bus/usb:/dev/bus/usb your-image
  • --privileged:授予容器访问主机设备的权限(也可更精细地用--device指定单个USB设备)
  • -v /run/udev:/run/udev:ro:只读挂载udev运行目录,让容器能监听设备事件
  • -v /dev/bus/usb:/dev/bus/usb:挂载USB设备总线目录,确保容器能访问USB设备

内容的提问来源于stack exchange,提问作者Shree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:27:34