0

我正在尝试使用 ctypes 在 python 中获取总/可用虚拟内存,但它似乎返回了一个非常不正确的值。下面是我目前拥有的代码

import ctypes
import ctypes.wintypes as wintypes

def _get_virtual_size():
    class MEMORYSTATUSEX(ctypes.Structure):
        _fields_ = [("dwLength", wintypes.DWORD),
                    ("dwMemoryLoad", wintypes.DWORD),
                    ("ullTotalPhys", ctypes.c_uint64),
                    ("ullAvailPhys", ctypes.c_uint64),
                    ("ullTotalPageFile", ctypes.c_uint64),
                    ("ullAvailPageFile", ctypes.c_uint64),
                    ("ullTotalVirtual", ctypes.c_uint64),
                    ("ullAvailVirtual", ctypes.c_uint64),
                    ("ullAvailExtendedVirtual", ctypes.c_uint64)]

        def __init__(self):
            ctypes.Structure.__init__(self)
            self.dwLength = ctypes.sizeof(self)

    kernel32 = ctypes.WinDLL("kernel32", use_last_error=True)
    GlobalMemoryStatusEx = kernel32.GlobalMemoryStatusEx
    GlobalMemoryStatusEx.restype = wintypes.BOOL
    GlobalMemoryStatusEx.argtypes = [ctypes.POINTER(MEMORYSTATUSEX)]

    status = MEMORYSTATUSEX()
    if GlobalMemoryStatusEx(status):
        return {'totalPage':status.ullAvailPageFile,  'total':status.ullTotalVirtual, 'available':status.ullAvailVirtual}
    return None

print _get_virtual_size()

结果:{'available':140737380003840L,'totalPage':13305126912L,'total':140737488224256L}

注意:使用 psutil 的值似乎报告正确,但需要不使用 psutil 的解决方案。

import psutil
print psutil.virtual_memory()

结果:svmem(总计=17114841088L,可用=13436207104L,百分比=21.5,使用=3678633984L,空闲=13436207104L)

如何使用 ctypes 方法获得 psutil 报告的相同值。我目前在 Windows 8.1 上的 Python 2.7.10 64Bit 中运行上述代码

任何帮助,将不胜感激。

4

1 回答 1

0

尝试使用此代码。不确定它是否适合您。我在 64 位 windows 7 pc 上运行 32 位 Python {Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32}。我已将返回的值与我的 Windows 任务管理器应用程序的性能选项卡中报告的值进行了比较。

import ctypes

class MEMORYSTATUSEX(ctypes.Structure):
    _fields_ = [
        ("dwLength", ctypes.c_ulong),
        ("dwMemoryLoad", ctypes.c_ulong),
        ("ullTotalPhys", ctypes.c_ulonglong),
        ("ullAvailPhys", ctypes.c_ulonglong),
        ("ullTotalPageFile", ctypes.c_ulonglong),
        ("ullAvailPageFile", ctypes.c_ulonglong),
        ("ullTotalVirtual", ctypes.c_ulonglong),
        ("ullAvailVirtual", ctypes.c_ulonglong),
        ("ullAvailExtendedVirtual", ctypes.c_ulonglong)
    ]

    def __init__(self):
        # have to initialize this to the size of MEMORYSTATUSEX
        self.dwLength = ctypes.sizeof(self)
        super(MEMORYSTATUSEX, self).__init__()

stat = MEMORYSTATUSEX()
ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))

print("MemoryLoad: %d%%" % (stat.dwMemoryLoad))
print . . . #output other fields here
于 2016-10-11T08:55:43.050 回答