【发布时间】:2015-10-23 03:03:07
【问题描述】:
当我运行以下代码时:
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 位:
我的问题是如何访问 PrivateBytes 的完整 64 位荣耀?
除了这个 WMI 模块之外,还有其他完全可以从 python 读取 WMI 的方法吗?
【问题讨论】:
-
这是 WMI 1.4.9
-
@JacquesGaudin。谢谢,是的,很有趣。这不是为了调试泄漏,而只是一种估计,所以我认为私有字节可以。我只是想知道它是使用 2GB 还是 6GB 还是 22GB 只是为了了解一下。顺便说一句,我尝试使用 psutil 库,它也神秘地绑定到 32 位值。这是使用 32 位 Python 的,但这没关系,我相信其他一些值是 64 位的(python 整数是任意大小)。
-
您使用的 Python/PyWin32 版本实际上可能很重要。不确定它是否适用,但我在请求 WMI 数据时找到了this reference。听起来,请求 WMI 数据的 32 位应用程序默认将由 32 位提供程序返回。您是否愿意测试这是否适用于 64 位 Python?
-
仅供参考,我无法重现 Python 2.7.11 64 位的问题。你试过
long(obj.wmi_property('PrivateBytes').Value)吗?