如何使用Python将WMI对象转换为JSON格式?
将WMI USB设备对象转换为JSON格式的解决方案
问题描述
我用Python的wmi库写了一段检测USB设备的代码,运行后能输出Win32_USBHub的WMI对象实例,但试了很多方法都没法把这个WMI对象转成JSON格式,求解决办法。
我的代码
import wmi import win32com.client def Usb_detect(): raw_wql = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'" c = wmi.WMI () watcher = c.watch_for(raw_wql=raw_wql) # while 1: usb = watcher() #<class 'wmi._wmi_event'> return usb print(Usb_detect())
代码输出
instance of Win32_USBHub { Caption = "USB Composite Device "; ConfigManagerErrorCode = 0; ConfigManagerUserConfig = FALSE; CreationClassName = "Win32_USBHub"; Description = "USB Composite Device "; DeviceID = "xyz"; Name = "USB Composite Device "; PNPDeviceID = "xyz"; Status = "OK"; SystemCreationClassName = "Win32_ComputerSystem"; SystemName = "xyz"; };
解决方案
wmi库返回的wmi._wmi_event对象不能直接转JSON,但可以通过提取其TargetInstance属性中的字段生成字典,再转成JSON格式。
修改后的代码
import wmi import json def Usb_detect(): raw_wql = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'" c = wmi.WMI() watcher = c.watch_for(raw_wql=raw_wql) usb_event = watcher() # 提取TargetInstance的所有属性到字典 usb_dict = {} target_instance = usb_event.TargetInstance # 遍历所有属性名,获取对应值 for prop in target_instance.properties_: try: usb_dict[prop.name] = getattr(target_instance, prop.name) except Exception: usb_dict[prop.name] = None return usb_dict # 获取USB设备信息并转成JSON usb_info = Usb_detect() json_result = json.dumps(usb_info, indent=4, ensure_ascii=False) print(json_result)
简化写法
如果觉得上面的遍历太繁琐,也可以用字典推导式简化:
import wmi import json def Usb_detect(): raw_wql = "SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'" c = wmi.WMI() watcher = c.watch_for(raw_wql=raw_wql) usb_event = watcher() # 直接生成属性字典 usb_dict = {prop.name: getattr(usb_event.TargetInstance, prop.name, None) for prop in usb_event.TargetInstance.properties_} return usb_dict usb_info = Usb_detect() print(json.dumps(usb_info, indent=4, ensure_ascii=False))
原理说明
- 检测到USB事件后返回的
usb_event是事件对象,真正的设备信息存在TargetInstance属性里,它是Win32_USBHub的实例。 - 通过
properties_可以获取该实例的所有属性名称,再用getattr()逐个取出属性值,存入字典。 - 最后用
json.dumps()把字典转成格式化的JSON字符串,indent=4让输出更易读,ensure_ascii=False避免中文乱码。
内容的提问来源于stack exchange,提问作者karthi_chellaiah
相关产品推荐
相关产品推荐

