天天看點

如何在Python中獲得目前的CPU和RAM使用率?

本文翻譯自:How to get current CPU and RAM usage in Python?

What's your preferred way of getting current system status (current CPU, RAM, free disk space, etc.) in Python?

在Python中擷取目前系統狀态(目前CPU,RAM,可用磁盤空間等)的首選方式是什麼?

Bonus points for *nix and Windows platforms.

* nix和Windows平台的獎勵積分。

There seems to be a few possible ways of extracting that from my search:

似乎有幾種方法可以從我的搜尋中提取出來:
  1. Using a library such as PSI (that currently seems not actively developed and not supported on multiple platform) or something like pystatgrab (again no activity since 2007 it seems and no support for Windows). 使用PSI之類的庫(目前似乎尚未積極開發并且在多個平台上不受支援)或pystatgrab之類的庫 (自2007年以來一直沒有活動,它似乎也不支援Windows)。
  2. Using platform specific code such as using a

    os.popen("ps")

    or similar for the *nix systems and

    MEMORYSTATUS

    in

    ctypes.windll.kernel32

    (see this recipe on ActiveState ) for the Windows platform. 對于Windows平台,使用平台特定的代碼,例如對* nix系統使用

    os.popen("ps")

    或類似代碼,并在

    ctypes.windll.kernel32

    MEMORYSTATUS

    (請參見ActiveState上的此配方 )。
    One could put a Python class together with all those code snippets. 可以将Python類與所有這些代碼段放在一起。

It's not that those methods are bad but is there already a well-supported, multi-platform way of doing the same thing?

并不是說這些方法不好,而是已經有一種受支援的,跨平台的方法來做同樣的事情?

#1樓

參考:https://stackoom.com/question/19oS/如何在Python中獲得目前的CPU和RAM使用率

#2樓

The psutil library will give you some system information (CPU / Memory usage) on a variety of platforms:

psutil庫将為您提供各種平台上的一些系統資訊(CPU /記憶體使用情況):
psutil is a module providing an interface for retrieving information on running processes and system utilization (CPU, memory) in a portable way by using Python, implementing many functionalities offered by tools like ps, top and Windows task manager. psutil是一個子產品,提供了一個接口,該接口通過使用Python以可移植的方式檢索有關正在運作的程序和系統使用率(CPU,記憶體)的資訊,實作了ps,top和Windows任務管理器等工具提供的許多功能。 It currently supports Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD and NetBSD, both 32-bit and 64-bit architectures, with Python versions from 2.6 to 3.5 (users of Python 2.4 and 2.5 may use 2.1.3 version). 它目前支援32位和64位體系結構的Linux,Windows,OSX,Sun Solaris,FreeBSD,OpenBSD和NetBSD,Python版本從2.6到3.5(Python 2.4和2.5的使用者可以使用2.1.3版本)。

UPDATE: Here is some example usages of

psutil

:

更新:這是

psutil

一些用法

psutil

#!/usr/bin/env python
import psutil
# gives a single float value
psutil.cpu_percent()
# gives an object with many fields
psutil.virtual_memory()
# you can convert that object to a dictionary 
dict(psutil.virtual_memory()._asdict())
           

#3樓

I don't believe that there is a well-supported multi-platform library available.

我認為沒有可用的受支援的多平台庫。

Remember that Python itself is written in C so any library is simply going to make a smart decision about which OS-specific code snippet to run, as you suggested above.

請記住,Python本身是用C編寫的,是以,任何一個庫都隻是要明智地決定要運作哪個特定于作業系統的代碼段,如您在上面建議的那樣。

#4樓

"... current system status (current CPU, RAM, free disk space, etc.)" And "*nix and Windows platforms" can be a difficult combination to achieve.

“ ...目前系統狀态(目前CPU,RAM,可用磁盤空間等)”和“ * nix和Windows平台”可能很難組合。

The operating systems are fundamentally different in the way they manage these resources.

作業系統在管理這些資源的方式上根本不同。

Indeed, they differ in core concepts like defining what counts as system and what counts as application time.

實際上,它們在核心概念方面有所不同,例如定義什麼才算是系統以及什麼才算是應用程式時間。

"Free disk space"?

“可用磁盤空間”?

What counts as "disk space?"

什麼算作“磁盤空間”?

All partitions of all devices?

所有裝置的所有分區?

What about foreign partitions in a multi-boot environment?

多重引導環境中的外部分區呢?

I don't think there's a clear enough consensus between Windows and *nix that makes this possible.

我認為Windows和* nix之間沒有足夠清晰的共識使之成為可能。

Indeed, there may not even be any consensus between the various operating systems called Windows.

實際上,在稱為Windows的各種作業系統之間甚至可能沒有達成共識。

Is there a single Windows API that works for both XP and Vista?

是否有一個适用于XP和Vista的Windows API?

#5樓

Here's something I put together a while ago, it's windows only but may help you get part of what you need done.

這是我前幾天整理的東西,僅是Windows,但可以幫助您獲得部分所需的工作。

Derived from: "for sys available mem" http://msdn2.microsoft.com/en-us/library/aa455130.aspx

派生自:“ for sys available mem”,用于http://msdn2.microsoft.com/en-us/library/aa455130.aspx

"individual process information and python script examples" http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true

“單個過程資訊和python腳本示例” http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true

NOTE: the WMI interface/process is also available for performing similar tasks I'm not using it here because the current method covers my needs, but if someday it's needed to extend or improve this, then may want to investigate the WMI tools a vailable.

注意:WMI界面/過程也可用于執行類似的任務,因為目前的方法滿足了我的需求,是以我在這裡不使用它,但是如果有朝一日需要擴充或改進它,則可能需要研究可用的WMI工具。 。

WMI for python:

适用于python的WMI:

http://tgolden.sc.sabren.com/python/wmi.html

http://tgolden.sc.sabren.com/python/wmi.html

The code:

編碼:
'''
Monitor window processes

derived from:
>for sys available mem
http://msdn2.microsoft.com/en-us/library/aa455130.aspx

> individual process information and python script examples
http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true

NOTE: the WMI interface/process is also available for performing similar tasks
        I'm not using it here because the current method covers my needs, but if someday it's needed
        to extend or improve this module, then may want to investigate the WMI tools available.
        WMI for python:
        http://tgolden.sc.sabren.com/python/wmi.html
'''

__revision__ = 3

import win32com.client
from ctypes import *
from ctypes.wintypes import *
import pythoncom
import pywintypes
import datetime


class MEMORYSTATUS(Structure):
    _fields_ = [
                ('dwLength', DWORD),
                ('dwMemoryLoad', DWORD),
                ('dwTotalPhys', DWORD),
                ('dwAvailPhys', DWORD),
                ('dwTotalPageFile', DWORD),
                ('dwAvailPageFile', DWORD),
                ('dwTotalVirtual', DWORD),
                ('dwAvailVirtual', DWORD),
                ]


def winmem():
    x = MEMORYSTATUS() # create the structure
    windll.kernel32.GlobalMemoryStatus(byref(x)) # from cytypes.wintypes
    return x    


class process_stats:
    '''process_stats is able to provide counters of (all?) the items available in perfmon.
    Refer to the self.supported_types keys for the currently supported 'Performance Objects'

    To add logging support for other data you can derive the necessary data from perfmon:
    ---------
    perfmon can be run from windows 'run' menu by entering 'perfmon' and enter.
    Clicking on the '+' will open the 'add counters' menu,
    From the 'Add Counters' dialog, the 'Performance object' is the self.support_types key.
    --> Where spaces are removed and symbols are entered as text (Ex. # == Number, % == Percent)
    For the items you wish to log add the proper attribute name in the list in the self.supported_types dictionary,
    keyed by the 'Performance Object' name as mentioned above.
    ---------

    NOTE: The 'NETFramework_NETCLRMemory' key does not seem to log dotnet 2.0 properly.

    Initially the python implementation was derived from:
    http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true
    '''
    def __init__(self,process_name_list=[],perf_object_list=[],filter_list=[]):
        '''process_names_list == the list of all processes to log (if empty log all)
        perf_object_list == list of process counters to log
        filter_list == list of text to filter
        print_results == boolean, output to stdout
        '''
        pythoncom.CoInitialize() # Needed when run by the same process in a thread

        self.process_name_list = process_name_list
        self.perf_object_list = perf_object_list
        self.filter_list = filter_list

        self.win32_perf_base = 'Win32_PerfFormattedData_'

        # Define new datatypes here!
        self.supported_types = {
                                    'NETFramework_NETCLRMemory':    [
                                                                        'Name',
                                                                        'NumberTotalCommittedBytes',
                                                                        'NumberTotalReservedBytes',
                                                                        'NumberInducedGC',    
                                                                        'NumberGen0Collections',
                                                                        'NumberGen1Collections',
                                                                        'NumberGen2Collections',
                                                                        'PromotedMemoryFromGen0',
                                                                        'PromotedMemoryFromGen1',
                                                                        'PercentTimeInGC',
                                                                        'LargeObjectHeapSize'
                                                                     ],

                                    'PerfProc_Process':              [
                                                                          'Name',
                                                                          'PrivateBytes',
                                                                          'ElapsedTime',
                                                                          'IDProcess',# pid
                                                                          'Caption',
                                                                          'CreatingProcessID',
                                                                          'Description',
                                                                          'IODataBytesPersec',
                                                                          'IODataOperationsPersec',
                                                                          'IOOtherBytesPersec',
                                                                          'IOOtherOperationsPersec',
                                                                          'IOReadBytesPersec',
                                                                          'IOReadOperationsPersec',
                                                                          'IOWriteBytesPersec',
                                                                          'IOWriteOperationsPersec'     
                                                                      ]
                                }

    def get_pid_stats(self, pid):
        this_proc_dict = {}

        pythoncom.CoInitialize() # Needed when run by the same process in a thread
        if not self.perf_object_list:
            perf_object_list = self.supported_types.keys()

        for counter_type in perf_object_list:
            strComputer = "."
            objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
            objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")

            query_str = '''Select * from %s%s''' % (self.win32_perf_base,counter_type)
            colItems = objSWbemServices.ExecQuery(query_str) # "Select * from Win32_PerfFormattedData_PerfProc_Process")# changed from Win32_Thread        

            if len(colItems) > 0:        
                for objItem in colItems:
                    if hasattr(objItem, 'IDProcess') and pid == objItem.IDProcess:

                            for attribute in self.supported_types[counter_type]:
                                eval_str = 'objItem.%s' % (attribute)
                                this_proc_dict[attribute] = eval(eval_str)

                            this_proc_dict['TimeStamp'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.') + str(datetime.datetime.now().microsecond)[:3]
                            break

        return this_proc_dict      


    def get_stats(self):
        '''
        Show process stats for all processes in given list, if none given return all processes   
        If filter list is defined return only the items that match or contained in the list
        Returns a list of result dictionaries
        '''    
        pythoncom.CoInitialize() # Needed when run by the same process in a thread
        proc_results_list = []
        if not self.perf_object_list:
            perf_object_list = self.supported_types.keys()

        for counter_type in perf_object_list:
            strComputer = "."
            objWMIService = win32com.client.Dispatch("WbemScripting.SWbemLocator")
            objSWbemServices = objWMIService.ConnectServer(strComputer,"root\cimv2")

            query_str = '''Select * from %s%s''' % (self.win32_perf_base,counter_type)
            colItems = objSWbemServices.ExecQuery(query_str) # "Select * from Win32_PerfFormattedData_PerfProc_Process")# changed from Win32_Thread

            try:  
                if len(colItems) > 0:
                    for objItem in colItems:
                        found_flag = False
                        this_proc_dict = {}

                        if not self.process_name_list:
                            found_flag = True
                        else:
                            # Check if process name is in the process name list, allow print if it is
                            for proc_name in self.process_name_list:
                                obj_name = objItem.Name
                                if proc_name.lower() in obj_name.lower(): # will log if contains name
                                    found_flag = True
                                    break

                        if found_flag:
                            for attribute in self.supported_types[counter_type]:
                                eval_str = 'objItem.%s' % (attribute)
                                this_proc_dict[attribute] = eval(eval_str)

                            this_proc_dict['TimeStamp'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.') + str(datetime.datetime.now().microsecond)[:3]
                            proc_results_list.append(this_proc_dict)

            except pywintypes.com_error, err_msg:
                # Ignore and continue (proc_mem_logger calls this function once per second)
                continue
        return proc_results_list     


def get_sys_stats():
    ''' Returns a dictionary of the system stats'''
    pythoncom.CoInitialize() # Needed when run by the same process in a thread
    x = winmem()

    sys_dict = { 
                    'dwAvailPhys': x.dwAvailPhys,
                    'dwAvailVirtual':x.dwAvailVirtual
                }
    return sys_dict


if __name__ == '__main__':
    # This area used for testing only
    sys_dict = get_sys_stats()

    stats_processor = process_stats(process_name_list=['process2watch'],perf_object_list=[],filter_list=[])
    proc_results = stats_processor.get_stats()

    for result_dict in proc_results:
        print result_dict

    import os
    this_pid = os.getpid()
    this_proc_results = stats_processor.get_pid_stats(this_pid)

    print 'this proc results:'
    print this_proc_results
           

http://monkut.webfactional.com/blog/archive/2009/1/21/windows-process-memory-logging-python

http://monkut.webfactional.com/blog/archive/2009/1/21/windows-process-memory-logging-python

#6樓

You can use psutil or psmem with subprocess example code

您可以将psutil或psmem與子流程示例代碼一起使用
import subprocess
cmd =   subprocess.Popen(['sudo','./ps_mem'],stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
out,error = cmd.communicate() 
memory = out.splitlines()
           

Reference http://techarena51.com/index.php/how-to-install-python-3-and-flask-on-linux/

參考http://techarena51.com/index.php/how-to-install-python-3-and-flask-on-linux/

https://github.com/Leo-g/python-flask-cmd

https://github.com/Leo-g/python-flask-cmd