合并USB检测与读写Python函数时报错:TypeError: 'NoneType'不可下标
问题排查与解决思路
1. 核心问题:设备对象未正确传递/获取
Function1只返回了idVendor和idProduct的字符串列表,但USB文件读写函数(USB_file_write)需要的是实际的USB设备对象,而非这两个ID数值。你大概率是在合并时只传递了ID,没通过ID去查找并获取有效的设备实例。
举个pyusb库的示例流程(如果用的是其他USB库,逻辑类似):
import usb.core # 把Function1返回的字符串ID转成USB库需要的整数格式(注意是十六进制还是十进制,这里假设返回的是十进制字符串) vendor_id = int('34148') product_id = int('4096') # 通过ID查找设备 dev = usb.core.find(idVendor=vendor_id, idProduct=product_id) if dev is None: raise ValueError("没找到对应USB设备")
重点检查:
- 是否把字符串ID转换成了USB库要求的整数格式(不同库可能要求十六进制/十进制,别搞混)
- 调用
USB_file_write前,是否确实通过ID拿到了有效的dev对象,而非直接把ID当作设备传进去
2. 排查权限与挂载时机
即使ID正确,也可能因为以下原因拿不到设备对象:
- 当前用户没有USB设备的读写权限,导致
dev返回None:可以临时用sudo运行脚本测试,确认是权限问题后,给对应设备加udev规则永久授权 - USB刚被检测到,文件系统还没挂载完成:在Function1检测到设备后,加个短暂延迟(比如
time.sleep(2)),等挂载完成再去获取设备对象
3. 检查变量作用域
合并函数后可能出现作用域问题:比如dev是Function1里的局部变量,没传递到USB_file_write里,导致后者用的dev是未初始化的None。
解决方式:
- 让
USB_file_write显式接收dev作为参数,调用时把找到的设备对象传进去 - 别依赖全局变量传设备,显式传参更可靠
4. 强制校验设备实例有效性
在获取dev后立刻做校验,快速定位问题:
dev = usb.core.find(idVendor=vendor_id, idProduct=product_id) assert dev is not None, f"找不到vendor={vendor_id}, product={product_id}的设备"
如果断言失败,说明设备可能被其他进程占用(比如系统存储服务),或者USB库版本有兼容性问题。
内容的提问来源于stack exchange,提问作者j ton
相关产品推荐
相关产品推荐

