| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- import sys
- import os
- import ctypes
- import _winreg
- """Class to extract system information from a MS-Windows Box:
- Instructions for Using:
- Instance the class WindowsSystemInformation
- Then in the instance, access the following variables:
- os
- cpu
- totalRAM
- totalVM
- availableVM
- availableRAM
- Example:
- s = SystemInformation()
- print s.os
- s.refresh() # if you need to refresh the dynamic data (i.e. Memory stats, etc)
- """
- def get_registry_value(key, subkey, value):
- if sys.platform != 'win32':
- raise OSError("get_registry_value is only supported on Windows")
-
- key = getattr(_winreg, key)
- handle = _winreg.OpenKey(key, subkey)
- (value, type) = _winreg.QueryValueEx(handle, value)
- return value
- c_ulong = ctypes.c_ulong
- class MEMORYSTATUS(ctypes.Structure):
- _fields_ = [
- ('dwLength', c_ulong),
- ('dwMemoryLoad', c_ulong),
- ('dwTotalPhys', c_ulong),
- ('dwAvailPhys', c_ulong),
- ('dwTotalPageFile', c_ulong),
- ('dwAvailPageFile', c_ulong),
- ('dwTotalVirtual', c_ulong),
- ('dwAvailVirtual', c_ulong)
- ]
- class SystemInformation:
- def __init__(self):
- # Just in in case somebody called this class by accident, we should
- # check to make sure the OS is MS-Windows before continuing.
- assert sys.platform == 'win32', "Not an MS-Windows Computer. This class should not be called"
-
- # os contains the Operating System Name with Service Pack and Build
- # Example: Microsoft Windows XP Service Pack 2 (build 2600)
-
- self.os = self._os_version().strip()
-
- # cpu contains the CPU model and speed
- # Example: Intel Core(TM)2 CPU 6700 @ 2.66GHz
- self.cpu = self._cpu().strip()
- self.totalRAM, self.availableRAM, self.totalPF, self.availablePF, self.memoryLoad, self.totalVM, self.availableVM = self._ram()
- # totalRam contains the total amount of RAM in the system
- self.totalRAM = self.totalRAM / 1024
- # totalVM contains the total amount of VM available to the system
-
- self.totalVM = self.totalVM / 1024
- # availableVM contains the amount of VM that is free
-
- self.availableVM = self.availableVM / 1024
- # availableRam: Ammount of available RAM in the system
-
- self.availableRAM = self.availableRAM / 1024
- def refresh(self):
- self.totalRAM, self.availableRAM, self.totalPF, self.availablePF, self.memoryLoad, self.totalVM, self.availableVM = self._ram()
- self.totalRAM = self.totalRAM / 1024
- self.totalVM = self.totalVM / 1024
- self.availableVM = self.availableVM / 1024
- self.availableRAM = self.availableRAM / 1024
- def _os_version(self):
- def get(key):
- return get_registry_value(
- "HKEY_LOCAL_MACHINE",
- "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
- key)
- os = get("ProductName")
- sp = get("CSDVersion")
- build = get("CurrentBuildNumber")
- return "%s %s (build %s)" % (os, sp, build)
-
- def _cpu(self):
- return get_registry_value(
- "HKEY_LOCAL_MACHINE",
- "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",
- "ProcessorNameString")
-
- def _ram(self):
- kernel32 = ctypes.windll.kernel32
-
- memoryStatus = MEMORYSTATUS()
- memoryStatus.dwLength = ctypes.sizeof(MEMORYSTATUS)
- kernel32.GlobalMemoryStatus(ctypes.byref(memoryStatus))
- return (memoryStatus.dwTotalPhys, memoryStatus.dwAvailPhys, memoryStatus.dwTotalPageFile, memoryStatus.dwAvailPageFile, memoryStatus.dwMemoryLoad, memoryStatus.dwTotalVirtual, memoryStatus.dwAvailVirtual)
- # To test, execute the script standalone.
- if __name__ == "__main__":
- s = SystemInformation()
- print s.os
- print s.cpu
- print "RAM : %dKb total" % s.totalRAM
- print "RAM : %dKb free" % s.availableRAM
- print "Total VM: %dKb" % s.totalVM
- print "Available VM: %dKb" % s.availableVM
|