【问题标题】:Get memory usage of computer in Windows with Python使用 Python 在 Windows 中获取计算机的内存使用情况
【发布时间】:2011-01-02 07:38:07
【问题描述】:

我如何从运行在 Windows XP 上的 Python 得知计算机的总体内存使用情况?

【问题讨论】:

    标签: python memory winapi memory-management pywin32


    【解决方案1】:

    您需要使用wmi 模块。像这样的:

    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"
    

    【讨论】:

    • 对不起,这会获取总物理内存(显然)——我将保持打开状态,因为这是朝着正确方向迈出的一步,直到我找到 WMI 命令来获取已用/可用内存.
    • +1。更改它以获取正确的数据将是微不足道的。
    • @NigelHeffernan 现有答案已经使用 Win32_OperatingSystem 访问 FreePhysicalMemory。
    • 谢谢迈克尔 - 我应该多喝咖啡或者回家
    【解决方案2】:

    您可以在 WMI 中查询性能计数器。我做了类似的事情,但使用了磁盘空间。

    一个非常有用的链接是Python WMI Tutorial by Tim Golden

    【讨论】:

      【解决方案3】:

      您也可以直接从 python 调用 GlobalMemoryStatusEx()(或任何其他 kernel32 或 user32 导出):

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

      在这种情况下,它不一定像 WMI 那样有用,但绝对是一个很好的小窍门。

      【讨论】:

      • 这个太棒了,不知道你可以在 Windows 中做到这一点。
      • 这是 init 中的返回?你为什么要这么做?
      • super调用可以省略,因为dwLength之前已经初始化过了,其他字段不需要初始化。
      • 如果我在 unix 中导入 ctypedir(ctype) 不会有 ctype.windll,对吗?
      猜你喜欢
      • 2011-07-04
      • 2016-08-29
      • 2013-04-25
      • 2012-02-11
      • 2011-01-17
      • 2023-03-27
      • 2010-09-21
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多