[英]incorrect virtual memory report using ctypes in windows
我正在尝试使用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中运行以上代码
任何帮助,将不胜感激。
尝试使用此代码。 不确定是否适合您。 我在64位Windows 7 pc上运行32位Python (Python 2.7.6(默认值,2013年11月10日,19:24:18)[win32上的MSC v.1500 32位(英特尔))} 。 我将返回的值与Windows Task Manager应用程序的“性能”选项卡中报告的值进行了比较。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.