Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中从WMI获取64位值_Python_Wmi - Fatal编程技术网

如何在python中从WMI获取64位值

如何在python中从WMI获取64位值,python,wmi,Python,Wmi,当我运行以下代码时: 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').Valu

当我运行以下代码时:

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值为0xFFFFFF。如果使用“WMI Explorer”,我可以看到PrivateBytes值大于32位:

我的问题是如何访问PrivateBytes的完整64位文件

除了此WMI模块之外,还有其他完全从python读取WMI的方法吗?

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

这是WMI 1.4.9的一部分,您可能会感兴趣:@JacquesGaudin。谢谢,很有趣。这不是为了调试泄漏,只是一种估计,所以我认为私有字节就可以了。我只是想知道是使用2GB还是6GB或22GB只是为了了解一些情况。顺便说一句,我尝试使用psutil库,它还神秘地绑定到32位值。这与32位Python有关,但这不重要,我相信其他一些值是64位的(Python int是任意大小的)。实际上,这可能与您使用的Python/PyWin32的版本有关。不确定它是否适用,但我在请求WMI数据时发现了错误。听起来像是32位应用程序请求WMI数据将由32位提供程序默认返回。您愿意在64位Python上测试它是否有效吗?仅供参考,我无法用Python2.7.11 64位重现这个问题。您是否尝试过
long(obj.wmi_属性('PrivateBytes').Value)
?这似乎是个好主意。但是当我运行它时,我得到了错误“ValueError:invalid literal for int(),以10为基数:'Microsoft Windows 10 Pro | C:\\Windows | \\设备\\硬盘0\\Partition2'”。当我将“wmic process list full/format:csv”的输出转储到Excel中时,我看到列没有对齐。看起来有些很长的进程名(chrome?)包含逗号,这会弄乱格式。不确定是否有另一种/格式更可靠?您可以尝试使用
/format:textvaluelist.xsl
在单独的行中提供
name=value
,以找到更好的wmi查询“wmic path win32\u performatteddata\u perfproc\u process where”IDProcess=%d“获取PrivateBytes/格式:textvaluelist”。但它仍然无法在32位python上运行。不知怎的,连wimc都知道这是一个32位进程!似乎不可能。从命令行调用命令时会得到什么?从python调用时会得到什么?令我惊讶的是,32位python给出0xFFFFFF,64位python给出64位值,命令行给出64位值。除非Python打开某种类型的32位命令进程,否则我不认为这是可能的。