【问题标题】:incorrect virtual memory report using ctypes in windows在 Windows 中使用 ctypes 报告不正确的虚拟内存
【发布时间】:2016-07-07 14:22:46
【问题描述】:

我正在尝试使用 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(total=17114841088L, available=13436207104L, percent=21.5, used=3678633984L, free=13436207104L)

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

任何帮助将不胜感激。

【问题讨论】:

  • 'MEMORYSTATUSEX` 结构有 7 个信息字段,您只检查了其中三个。

标签: python windows ctypes virtual-memory psutil


【解决方案1】:

尝试使用此代码。不确定它是否适合您。我在 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

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2014-06-30
    相关资源
    最近更新 更多