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

Python USB/便携驱动器/鼠标检测函数报错排查请求

USB设备检测Python函数故障排查

我要开发一个能检测USB存储设备、便携驱动器或USB鼠标的Python程序,但修改后的get_USBid函数始终无法正常运行:

  • 保留try-except块时,无论输入哪种设备类型参数,都会返回error in get_USBid()
  • 移除try-except块后,会触发UnboundLocalError: local variable 'USB_info' referenced before assignment
  • 尝试更新代码后问题仍未解决

原可正常运行的函数代码

def list_USB_all_info():
    print ( 'idVendor  idProduct  Manufacturer - Product')
    
    busses = usb.busses()
    
    all_in_string = ' '
    for bus in busses:
        for dev in bus.devices:
            if dev:
                xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct)
                if xdev._manufacturer is None:
                    xdev._manufacturer = usb.util.get_string(xdev, xdev.iManufacturer)
                if xdev._product is None:
                    xdev._product = usb.util.get_string(xdev, xdev.iProduct)
                print ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                            str(xdev._manufacturer).strip(),
                                            str(xdev._product).strip()))
                                            
                A = ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                            str(xdev._manufacturer).strip(),
                                            str(xdev._product).strip()))
       
                all_in_string += A  + "/end/"+"\n" 
                all_in_string_splited = all_in_string.split("/end/")
                          
    
    print ("= = = =")
    all_in_string_match_Mass_Storage_Device = [s for s in all_in_string_splited if "Mass Storage Device" in s]
    
    print ("+ + + +")
    all_in_string_match_Mass_Storage_Device_str = str(all_in_string_match_Mass_Storage_Device)
    y = re.findall('[0-9.]+',all_in_string_match_Mass_Storage_Device_str)  
    idVendor = y[0]
    idProduct = y[1]
    
    return all_in_string_match_Mass_Storage_Device , idVendor , idProduct

result_USB, idVendor, idProduct = list_USB_all_info()

print(result_USB)
print(idVendor)
print(idProduct)

初始修改的get_USBid代码及错误输出

import time
from usb.core import find
from usb.util import get_string
import usb.backend.libusb1
import re
import usb.core
import usb.util
import os
import numpy as np
import os.path
from os import path


def get_USBid(type_USB):
    try:
        busses = usb.busses()
        
        all_in_string = ' '
        for bus in busses:
            for dev in bus.devices:
                if dev:
                    xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct)
                    if xdev._manufacturer is None:
                        xdev._manufacturer = usb.util.get_string(xdev, xdev.iManufacturer)
                    if xdev._product is None:
                        xdev._product = usb.util.get_string(xdev, xdev.iProduct)
                  
                                                
                    A = ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                                str(xdev._manufacturer).strip(),
                                                str(xdev._product).strip()))
          
                    all_in_string += A  + "/end/"+"\n" 
                    string_splited = all_in_string.split("/end/")
       
        if type_USB == 1:
            USB_info = [s for s in string_splited if "Mass Storage Device" in s]

        if type_USB == 2:
            USB_info = [s for s in string_splited if "Portable Super Multi Drive" in s]

        if type_USB == 3:
            USB_info = [s for s in string_splited if "USB Optical Mouse" in s]
        
        USB_info_str = str(USB_info)
        y = re.findall('[0-9.]+',USB_info_str)  
        idVendor = y[0]
        idProduct = y[1]

    except Exception as e:   
        return "error in get_USBid()" 

    return USB_info


type_USB = input("Enter your USBid type: ")
result_USB = get_USBid(type_USB)
print(result_USB)

错误输出:

Enter your USBid type: 1
error in get_USBid()

移除try-except块后的错误输出:

Enter your USBid type: 1
Traceback (most recent call last):
File "/home/joy/fe_dir/damm.py", line 60, in <module>
result_USB = get_USBid(type_USB)
File "/home/joy/fe_dir/damm.py", line 49, in get_USBid
USB_info_str = str(USB_info)
UnboundLocalError: local variable 'USB_info' referenced before assignment

更新后的代码及错误输出

import time
from usb.core import find
from usb.util import get_string
import usb.backend.libusb1
import re
import usb.core
import usb.util
import os
import numpy as np
import os.path
from os import path


def get_USBid(type_USB):
    try:
        busses = usb.busses()
        
        all_in_string = ' '
        for bus in busses:
            for dev in bus.devices:
                if dev:
                    xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct)
                    if xdev._manufacturer is None:
                        xdev._manufacturer = usb.util.get_string(xdev, xdev.iManufacturer)
                    if xdev._product is None:
                        xdev._product = usb.util.get_string(xdev, xdev.iProduct)
                  
                                                
                    A = ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                                str(xdev._manufacturer).strip(),
                                                str(xdev._product).strip()))
          
                    all_in_string += A  + "/end/"+"\n" 
                    string_splited = all_in_string.split("/end/")
       
        USB_info = None
        if type_USB == 1:
            USB_info = [s for s in string_splited if "Mass Storage Device" in s]
        elif type_USB == 2:
            USB_info = [s for s in string_splited if "Portable Super Multi Drive" in s]
        elif type_USB == 3:
            USB_info = [s for s in string_splited if "USB Optical Mouse" in s]

        if USB_info is None:
            raise Exception('USB_info is None')
        
        USB_info_str = str(USB_info)
        y = re.findall('[0-9.]+',USB_info_str)  
        idVendor = y[0]
        idProduct = y[1]

    except Exception as e:   
        return "error in get_USBid()" 

    return USB_info


type_USB = input("Enter your USBid type: ")
result_USB = get_USBid(type_USB)
print(result_USB)

错误输出:

(base) joy@joy-System-Product-Name:~$ sudo python '/home/joy/fe_dir/damm.py'
Enter your USBid type: 1
error in get_USBid()
(base) joy@joy-System-Product-Name:~$ sudo python '/home/joy/fe_dir/damm.py'
Enter your USBid type: 2
error in get_USBid()

问题原因分析

  1. 输入类型不匹配:input()获取的是字符串类型,但代码中直接和整数1/2/3比较,导致所有条件都不满足,USB_info保持为None,触发后续异常。
  2. 异常捕获过于宽泛:except Exception as e捕获所有异常,且仅返回固定错误信息,无法定位具体问题(比如类型不匹配、设备未找到、正则匹配失败等)。
  3. 设备匹配字符串可能不准确:代码中使用的设备名称(如"Mass Storage Device")可能和实际设备的Product名称不一致,导致过滤后USB_info为空列表,后续正则匹配时y为空,访问y[0]会触发索引错误。

修复方案及代码

修复要点

  • 转换输入类型为整数,确保类型匹配
  • 优化异常处理,返回具体错误信息
  • 初始化USB_info为空列表,避免未赋值报错
  • 增加设备未找到、参数无效的判断逻辑

修复后的代码

import time
import re
import usb.core
import usb.util


def get_USBid(type_USB):
    try:
        busses = usb.busses()
        all_in_string = ' '
        for bus in busses:
            for dev in bus.devices:
                if dev:
                    xdev = usb.core.find(idVendor=dev.idVendor, idProduct=dev.idProduct)
                    if xdev._manufacturer is None:
                        xdev._manufacturer = usb.util.get_string(xdev, xdev.iManufacturer)
                    if xdev._product is None:
                        xdev._product = usb.util.get_string(xdev, xdev.iProduct)
                    
                    A = ('%8d  %9d  %s - %s' % (dev.idVendor, dev.idProduct,
                                                str(xdev._manufacturer).strip(),
                                                str(xdev._product).strip()))
                    all_in_string += A  + "/end/"+"\n" 
        string_splited = all_in_string.split("/end/")
        
        USB_info = []
        if type_USB == 1:
            USB_info = [s for s in string_splited if "Mass Storage Device" in s]
        elif type_USB == 2:
            USB_info = [s for s in string_splited if "Portable Super Multi Drive" in s]
        elif type_USB == 3:
            USB_info = [s for s in string_splited if "USB Optical Mouse" in s]
        else:
            return "无效的设备类型,请输入1、2或3"
        
        if not USB_info:
            return "未找到指定类型的USB设备"
        
        USB_info_str = str(USB_info)
        y = re.findall('[0-9.]+', USB_info_str)
        if len(y) < 2:
            return "无法提取设备的idVendor和idProduct"
        
        idVendor = y[0]
        idProduct = y[1]
        return USB_info, idVendor, idProduct

    except Exception as e:
        return f"错误信息: {str(e)}"


try:
    type_USB = int(input("Enter your USBid type: "))
    result = get_USBid(type_USB)
    print(result)
except ValueError:
    print("请输入有效的整数类型(1、2或3)")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:30:53