【发布时间】: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