本文翻譯自: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:
似乎有幾種方法可以從我的搜尋中提取出來:- 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)。
- Using platform specific code such as using a
or similar for the *nix systems andos.popen("ps")
inMEMORYSTATUS
(see this recipe on ActiveState ) for the Windows platform. 對于Windows平台,使用平台特定的代碼,例如對* nix系統使用ctypes.windll.kernel32
或類似代碼,并在os.popen("ps")
ctypes.windll.kernel32
(請參見ActiveState上的此配方 )。 One could put a Python class together with all those code snippets. 可以将Python類與所有這些代碼段放在一起。MEMORYSTATUS
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=trueNOTE: 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.htmlThe 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