python 如何从 WMI 获取 64 位值
How to get 64-bit value from WMI in python
当我运行以下代码时:
def get_process_info(pid):
c = wmi.WMI(namespace='root\cimv2')
obj = c.Win32_Process(ProcessId = pid)[0]
print "VirtualSize:", obj.wmi_property('VirtualSize').type
print "VirtualSize:", obj.wmi_property('VirtualSize').Value
def get_perf_info(pid):
c = wmi.WMI(namespace='root\cimv2')
obj = c.Win32_PerfFormattedData_PerfProc_Process(IDProcess = pid)[0]
print "PrivateBytes:", obj.wmi_property('PrivateBytes').type
print "PrivateBytes:", obj.wmi_property('PrivateBytes').Value
针对一个使用大量内存的进程,我得到这个:
VirtualSize: uint64
VirtualSize: 5015498752
PrivateBytes: uint64
PrivateBytes: 4294967295
请注意,两者都被列为 64 位值,但 PrivateBytes 值是 0xFFFFFFFF。如果我使用 "WMI Explorer",我可以看到 PrivateBytes 值大于 32 位:
我的问题是如何访问完整的 64 位 PrivateBytes?
除了这个 WMI 模块之外,还有其他完全不同的方法可以从 python 读取 WMI 吗?
您可以使用 wmic,它为 WMI 提供命令行界面:
def find_privatebytes(pid):
with os.popen('wmic process list full /format:csv') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
crow = 0
col_pid = 0
col_pb = 0
for row in reader:
if len(row) == 0:
continue
if crow == 0:
col_pid = row.index("ProcessId")
col_pb = row.index("PrivatePageCount")
crow += 1
elif int(row[col_pid]) == pid:
return int(row[col_pb])
return 0
当我运行以下代码时:
def get_process_info(pid):
c = wmi.WMI(namespace='root\cimv2')
obj = c.Win32_Process(ProcessId = pid)[0]
print "VirtualSize:", obj.wmi_property('VirtualSize').type
print "VirtualSize:", obj.wmi_property('VirtualSize').Value
def get_perf_info(pid):
c = wmi.WMI(namespace='root\cimv2')
obj = c.Win32_PerfFormattedData_PerfProc_Process(IDProcess = pid)[0]
print "PrivateBytes:", obj.wmi_property('PrivateBytes').type
print "PrivateBytes:", obj.wmi_property('PrivateBytes').Value
针对一个使用大量内存的进程,我得到这个:
VirtualSize: uint64
VirtualSize: 5015498752
PrivateBytes: uint64
PrivateBytes: 4294967295
请注意,两者都被列为 64 位值,但 PrivateBytes 值是 0xFFFFFFFF。如果我使用 "WMI Explorer",我可以看到 PrivateBytes 值大于 32 位:
我的问题是如何访问完整的 64 位 PrivateBytes?
除了这个 WMI 模块之外,还有其他完全不同的方法可以从 python 读取 WMI 吗?
您可以使用 wmic,它为 WMI 提供命令行界面:
def find_privatebytes(pid):
with os.popen('wmic process list full /format:csv') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='"')
crow = 0
col_pid = 0
col_pb = 0
for row in reader:
if len(row) == 0:
continue
if crow == 0:
col_pid = row.index("ProcessId")
col_pb = row.index("PrivatePageCount")
crow += 1
elif int(row[col_pid]) == pid:
return int(row[col_pb])
return 0