2010-01-07 5 views

Antwort

11

Sie möchten das Modul wmi verwenden. Etwas wie dieses:

import wmi 
comp = wmi.WMI() 

for i in comp.Win32_ComputerSystem(): 
    print i.TotalPhysicalMemory, "bytes of physical memory" 

for os in comp.Win32_OperatingSystem(): 
    print os.FreePhysicalMemory, "bytes of available memory" 
+0

Es tut mir leid, das bekommt den gesamten physikalischen Speicher (offensichtlich) - ich werde offen lassen, da es ein Schritt in die richtige Richtung ist, bis ich den WMI-Befehl finde, um den belegten/freien Speicher zu bekommen. –

+1

+1. Es wird trivial sein, dies zu ändern, um die richtigen Daten zu holen. – Skurmedel

+0

@NigelHeffernan Die vorhandene Antwort verwendet bereits Win32_OperatingSystem, um auf FreePhysicalMemory zuzugreifen. –

18

Sie können auch anrufen nur GlobalMemoryStatusEx() (oder anderen kernel32 oder user32 Export) direkt aus Python:

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), 
     ("sullAvailExtendedVirtual", 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)) 

Nicht unbedingt so nützlich wie WMI in diesem Fall, aber auf jeden Fall einen netten Trick zu haben deine Gesäßtasche.

+0

Dieser war großartig, hatte keine Ahnung, dass Sie das in Windows tun könnten. – Anders

+0

Das ist eine Rückkehr in __init__? Warum würdest du das tun? – Arafangion

+0

Der Superaufruf kann weggelassen werden, da dwLength zuvor initialisiert wurde und die anderen _fields_ nicht initialisiert werden müssen. – phobie