Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Saturday, September 24, 2016

How to get current CPU and RAM usage in Python?

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? Bonus points for *nix and Windows platforms.

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

  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. One could put a Python class together with all those code snippets.

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

Answer by user35952 for How to get current CPU and RAM usage in Python?


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.

Answer by S.Lott for How to get current CPU and RAM usage in Python?


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

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. Indeed, there may not even be any consensus between the various operating systems called Windows. Is there a single Windows API that works for both XP and Vista?

Answer by monkut for How to get current CPU and RAM usage in Python?


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

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, then may want to investigate the WMI tools a vailable.

WMI for python:

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

Answer by Jon Cage for How to get current CPU and RAM usage in Python?


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

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.

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

Answer by LeoG for How to get current CPU and RAM usage in Python?


You can use psutil or psmem with subprocess example code

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/

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

Answer by wordsforthewise for How to get current CPU and RAM usage in Python?


Use the psutil library. For me on Ubuntu, pip installed 0.4.3. You can check your version of psutil by doing

from __future__ import print_function  import psutil  print(psutil.__versi??on__)  

in Python.

To get some memory and CPU stats:

from __future__ import print_function  import psutil  print(psutil.cpu_percent())  #  for version 0.5.0  print(psutil.phymem_usage()) #  physical memory usage  #  for version 4.3.0  print(psutil.virtual_memory()) #  I think still physical memory use,   #  the % is the same as psutil.phymem_usage() from 0.5.0  

I also like to do:

import os  import psutil  pid = os.getpid()  py = psutil.Process(pid)  memoryUse = py.memory_info()[0]/2.**30  # memory use in GB...I think  print('memory use:', memoryUse)  

which gives the current memory use of your Python script.

There are some more in-depth examples on the pypi page for 4.3.0 and 0.5.0.

For Ubuntu 16 and 14, installing from pip gave me version 4.3.0, which doesn't have the phymem_usage() method. To get 0.5.0, download the tar.gz file, then do

tar -xvzf psutil-0.5.0.tar.gz??  cd psutil-0.5.0  sudo python setup.py install  


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

0 comments:

Post a Comment

Popular Posts

Powered by Blogger.