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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 05:24:10