【问题标题】:How to get 64-bit value from WMI in python如何在 python 中从 WMI 获取 64 位值
【发布时间】: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
  • 您可能会感兴趣:stackoverflow.com/questions/1984186/…
  • @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) 吗?

标签: python wmi


【解决方案1】:

您可以使用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

【讨论】:

  • 似乎是个好主意。但是当我运行它时,我收到错误“ValueError:int() 的无效文字,基数为 10:'Microsoft Windows 10 Pro|C:\\WINDOWS|\\Device\\Harddisk0\\Partition2'”。当我将“wmic process list full /format:csv”的输出转储到 Excel 中时,我看到列没有排列。似乎一些很长的进程名称(chrome?)包含逗号,这会弄乱格式。不确定是否还有另一种更强大的 /format?
  • 您可以尝试使用/format:textvaluelist.xsl,它在单独的行中给出name=value
  • 找到了一个更好的 wmi 查询“wmic path win32_perfformatteddata_perfproc_process where "IDProcess=%d" get PrivateBytes /format:textvaluelist'。但它仍然在 32 位上不起作用python。不知何故,甚至 wimc 都知道这是一个 32 位进程!似乎不可能。
  • 从命令行调用命令会得到什么?从 python 调用时会得到什么?
  • 令我惊讶的是,32 位 python 给出 0xFFFFFFFF,64 位 python 给出 64 位值,命令行给出 64 位值。除非 Python 打开某种 32 位命令进程,否则我看不出这怎么可能。 See gist
猜你喜欢
  • 2016-07-27
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
相关资源
最近更新 更多