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()
问题原因分析
- 输入类型不匹配:
input()获取的是字符串类型,但代码中直接和整数1/2/3比较,导致所有条件都不满足,USB_info保持为None,触发后续异常。 - 异常捕获过于宽泛:
except Exception as e捕获所有异常,且仅返回固定错误信息,无法定位具体问题(比如类型不匹配、设备未找到、正则匹配失败等)。 - 设备匹配字符串可能不准确:代码中使用的设备名称(如"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
相关产品推荐
相关产品推荐

