2010-01-07 27 views

Trả lời

11

Bạn sẽ muốn sử dụng mô-đun wmi. Một cái gì đó như thế này:

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

Tôi xin lỗi, điều này nhận được bộ nhớ vật lý tổng thể (rõ ràng) - Tôi sẽ để mở vì đây là một bước đi đúng hướng cho đến khi tôi tìm thấy lệnh WMI để nhận bộ nhớ đã sử dụng/miễn phí. –

+1

+1. Nó sẽ là tầm thường để thay đổi điều này để lấy dữ liệu chính xác. – Skurmedel

+0

@NigelHeffernan Câu trả lời hiện có đã sử dụng Win32_OperatingSystem để truy cập FreePhysicalMemory. –

0

Bạn có thể truy vấn bộ đếm hiệu suất trong WMI. Tôi đã làm một cái gì đó tương tự nhưng với không gian đĩa để thay thế.

Liên kết rất hữu ích là Python WMI Tutorial by Tim Golden.

18

Bạn cũng có thể chỉ cần gọi GlobalMemoryStatusEx() (hoặc bất kỳ kernel32 khác hoặc user32 xuất khẩu) trực tiếp từ 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)) 

Không nhất thiết hữu ích như WMI trong trường hợp này, nhưng chắc chắn một thủ thuật thú vị khi có trong túi sau của bạn.

+0

Điều này thật tuyệt vời, bạn không biết mình có thể làm điều này trong Windows. – Anders

+0

Đó là sự trở lại trong __init__? Tại sao bạn lại làm vậy? – Arafangion

+0

Siêu cuộc gọi có thể được bỏ qua vì dwLength đã được khởi tạo trước và các _fields_ khác không cần khởi tạo. – phobie

Các vấn đề liên quan