2016-07-07 19 views
0

Ich versuche, den gesamten/verfügbaren virtuellen Speicher in Python mit Ctypes zu erhalten, aber es scheint einen sehr falschen Wert zurückzugeben. unten ist der Code, ich habe zur Zeitinkorrekter virtueller Speicherbericht mit Ctypes in Windows

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() 

Ergebnis: { 'verfügbar': 140737380003840L, 'totalPage': 13305126912L, 'total': 140737488224256L}

Hinweis: Die Verwendung psutil der Wert scheint korrekt gemeldet werden, aber eine Lösung ohne psutil benötigen.

import psutil 
print psutil.virtual_memory() 

Ergebnis: svmem (gesamt = 17114841088L, verfügbar = 13436207104L, Prozent = 21,5, verwendet = 3678633984L, frei = 13436207104L)

Wie ich die gleichen Werte von psutil gemeldet bekommen Sie mit die Ctypes-Methode. Ich führe derzeit den obigen Code in Python 2.7.10 64Bit unter Windows 8.1

Jede Hilfe wäre willkommen.

+0

'MEMORYSTATUSEX' struct hat 7 Felder zur Information, Sie haben nur drei von ihnen überprüft. –

Antwort

0

Versuchen Sie, diesen Code zu verwenden. Nicht sicher, ob es für Sie funktioniert. Ich verwende 32-Bit-Python auf einem 64-Bit-Windows 7 pc {Python 2.7.6 (Standard, 10. November 2013, 19.24.18) [MSC v.1500 32 Bit (Intel)] auf win32} . Ich habe die zurückgegebenen Werte mit denen verglichen, die auf der Registerkarte "Leistung" meiner Windows Task-Manager-Anwendung gemeldet wurden.

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