Python使用infi.devicemanager检测设备时Device类型匹配报错求助
问题根因
你的判断完全准确:遍历dm.all_devices得到的device是infi.devicemanager库封装的Device类实例,并非原生字符串类型。
直接print(device)能输出正确设备名,是因为Device类实现了__str__魔法方法,打印操作会自动调用该方法把实例转为字符串输出,但直接把实例对象用于in关键字做字符串包含判断时,Python不会做隐式类型转换,因此抛出TypeError: argument of type 'Device' is not iterable错误。
修复方案
方法1:显式类型转换(最通用)
直接用Python内置的str()方法,把Device实例手动转为字符串后再做匹配即可。
修正后的完整代码:
def searchdongle(): found = 0 dm = DeviceManager() dm.root.rescan() devices = dm.all_devices for device in devices: # 显式将Device实例转换为字符串 device_name = str(device) print(device_name) # 此处保留你原有关键词匹配逻辑,若"Gaurdant"为拼写偏差可自行修正 if "Gaurdant" in device_name and "Code" in device_name: found = 1 print("Found it!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") # 找到目标设备后直接跳出循环,无需遍历剩余设备 break return found
方法2:直接访问设备名称属性
Device类本身提供了直接获取设备友好名称的属性friendly_name,该属性本身就是字符串类型,无需额外转换,可直接用于匹配:
# 替换方法1中的device_name赋值语句即可 device_name = device.friendly_name
注意:部分未配置友好名称的设备,friendly_name可能返回空值,遇到这类情况回退用str(device)获取设备描述字符串做匹配即可。
额外优化点
你原代码中循环外的devicesname = ""初始赋值没有实际作用,可以直接删掉,减少冗余变量。
内容的提问来源于stack exchange,提问作者Marlon
相关产品推荐
相关产品推荐

