如何在Python中获取当前的CPU和RAM使用情况?

如何在Python中获取当前系统状态(当前CPU、RAM、空闲磁盘空间等)?理想情况下,它可以同时适用于Unix和Windows平台。

从我的搜索中似乎有一些可能的方法:

  1. 使用诸如ψ(目前似乎没有积极开发,在多个平台上不支持)或pystatgrab之类的库(自2007年以来似乎没有活动,不支持Windows)。

  2. 使用特定于平台的代码,例如在*nix系统中使用os.popen("ps")或类似的代码,在Windows平台中使用ctypes.windll.kernel32中的MEMORYSTATUS(参见ActiveState上的这个食谱)。可以将所有这些代码片段放在一个Python类中。

这并不是说这些方法不好,而是是否已经有一种支持良好的多平台方式来做同样的事情?

620769 次浏览

我不相信有一个支持良好的多平台库可用。请记住,Python本身是用C编写的,因此任何库都会像上面建议的那样,对运行哪个特定于操作系统的代码段做出明智的决定。

“…当前系统状态(当前CPU、RAM、空闲磁盘空间等)”“*nix和Windows平台”可能是一个很难实现的组合。

操作系统在管理这些资源的方式上有根本的不同。实际上,它们在核心概念上有所不同,比如定义什么是系统,什么是应用程序时间。

“空闲磁盘空间”?什么算“磁盘空间”?所有设备的所有分区?多引导环境中的外部分区呢?

我不认为Windows和*nix之间有足够明确的共识来实现这一点。事实上,在被称为Windows的各种操作系统之间甚至可能没有任何共识。有没有一个Windows API同时适用于XP和Vista?

这是我前段时间整理的一些东西,它只是窗口,但可能会帮助你完成你需要完成的部分工作。

来自:< p > 对于系统可用的备忘录; http://msdn2.microsoft.com/en-us/library/aa455130.aspx < / p >

"个别进程信息和python脚本示例" http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true < / p > 注意:WMI接口/进程也可用于执行类似的任务 我在这里没有使用它,因为目前的方法满足了我的需求,但如果有一天需要扩展或改进它,那么可能需要研究可用的WMI工具

python的WMI:

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

代码:

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

psutil库给你在各种平台上关于CPU, RAM等的信息:

psutil是一个模块,提供了一个接口,通过使用Python以可移植的方式检索正在运行的进程和系统利用率(CPU,内存)的信息,实现了ps、top和Windows任务管理器等工具提供的许多功能。

它目前支持Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD和NetBSD, 32位和64位架构,Python版本从2.6到3.5 (Python 2.4和2.5的用户可能使用2.1.3版本)。


一些例子:

#!/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())
# you can have the percentage of used RAM
psutil.virtual_memory().percent
79.2
# you can calculate percentage of available memory
psutil.virtual_memory().available * 100 / psutil.virtual_memory().total
20.8

以下是其他文档,提供了更多的概念和感兴趣的概念:

  • < a href = " https://psutil.readthedocs。io / en /最近/ noreferrer“rel = > https://psutil.readthedocs.io/en/latest/ < / >
你可以在subprocess中使用psutil或psmem 示例代码< / p >
import subprocess
cmd =   subprocess.Popen(['sudo','./ps_mem'],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
out,error = cmd.communicate()
memory = out.splitlines()

参考

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

使用psutil图书馆。在Ubuntu 18.04上,pip在2019年1月30日安装了5.5.0(最新版本)。旧版本的行为可能有所不同。 你可以在Python中检查你的psutil版本:

from __future__ import print_function  # for Python2
import psutil
print(psutil.__versi‌​on__)

获取内存和CPU的统计信息:

from __future__ import print_function
import psutil
print(psutil.cpu_percent())
print(psutil.virtual_memory())  # physical memory usage
print('memory % used:', psutil.virtual_memory()[2])

virtual_memory(元组)将包含系统范围内使用的内存百分比。对我来说,在Ubuntu 18.04上,这似乎被高估了几个百分点。

你也可以得到当前Python实例所使用的内存:

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

它给出了Python脚本的当前内存使用情况。

关于Pypi页面为psutil还有一些更深入的例子。

下面的代码,没有外部库为我工作。我在Python 2.7.9测试

CPU使用率

import os
    

CPU_Pct=str(round(float(os.popen('''grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage }' ''').readline()),2))
print("CPU Usage = " + CPU_Pct)  # print results

和Ram使用,总,使用和免费

import os
mem=str(os.popen('free -t -m').readlines())
"""
Get a whole line of memory output, it will be something like below
['             total       used       free     shared    buffers     cached\n',
'Mem:           925        591        334         14         30        355\n',
'-/+ buffers/cache:        205        719\n',
'Swap:           99          0         99\n',
'Total:        1025        591        434\n']
So, we need total memory, usage and free memory.
We should find the index of capital T which is unique at this string
"""
T_ind=mem.index('T')
"""
Than, we can recreate the string with this information. After T we have,
"Total:        " which has 14 characters, so we can start from index of T +14
and last 4 characters are also not necessary.
We can create a new sub-string using this information
"""
mem_G=mem[T_ind+14:-4]
"""
The result will be like
1025        603        422
we need to find first index of the first space, and we can start our substring
from from 0 to this index number, this will give us the string of total memory
"""
S1_ind=mem_G.index(' ')
mem_T=mem_G[0:S1_ind]
"""
Similarly we will create a new sub-string, which will start at the second value.
The resulting string will be like
603        422
Again, we should find the index of first space and than the
take the Used Memory and Free memory.
"""
mem_G1=mem_G[S1_ind+8:]
S2_ind=mem_G1.index(' ')
mem_U=mem_G1[0:S2_ind]


mem_F=mem_G1[S2_ind+8:]
print 'Summary = ' + mem_G
print 'Total Memory = ' + mem_T +' MB'
print 'Used Memory = ' + mem_U +' MB'
print 'Free Memory = ' + mem_F +' MB'

仅适用于Linux: 仅依赖于stdlib的RAM使用的一行代码:

import os
tot_m, used_m, free_m = map(int, os.popen('free -t -m').readlines()[-1].split()[1:])

我觉得这些答案是为Python 2编写的,而且无论如何,没有人提到Python 3可用的标准resource包。它提供了获取给定进程(默认为调用Python进程)的资源限制的命令。这与整个系统获取当前资源的使用不一样,但它可以解决一些相同的问题,如e.g.。“我想确保这个脚本只使用X个内存。”

我们选择使用常用的信息源,因为我们可以找到空闲内存的瞬时波动,并且觉得查询meminfo数据源是有帮助的。这也帮助我们获得了一些预先解析的相关参数。

代码

import os


linux_filepath = "/proc/meminfo"
meminfo = dict(
(i.split()[0].rstrip(":"), int(i.split()[1]))
for i in open(linux_filepath).readlines()
)
meminfo["memory_total_gb"] = meminfo["MemTotal"] / (2 ** 20)
meminfo["memory_free_gb"] = meminfo["MemFree"] / (2 ** 20)
meminfo["memory_available_gb"] = meminfo["MemAvailable"] / (2 ** 20)

输出参考(我们剥离了所有换行以便进一步分析)

MemTotal: 1014500 kB MemFree: 562680 kB MemAvailable: 646364 kB Buffers: 15144 kB Cached: 210720 kB SwapCached: 0 kB Active: 261476 kB Inactive: 128888kb Active(anon): 167092 kB Inactive(anon): 20888kb Active(file): 94384 kB Inactive(file): 108000 kB Unevictable: 3652 kB Mlocked: 3652 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 168160 kB Mapped: 81352 kB Shmem: 21060 kB Slab: 34492 kB sreclaim: 18044 kB SUnreclaim: 16448 kB KernelStack: 2672 kB PageTables: 8180 kB nfs_instability: 0 kB Bounce: 0 kB WritebackTmp: 0 kB Committed_AS: 1038756 kB VmallocTotal: 34359738367 kB VmallocUsed: 0 kB VmallocChunk: 0 kB hardwarecorbroke: 0 kB AnonHugePages: 88064 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 0 Hugepagesize: 2048kb DirectMap4k: 43008 kB DirectMap2M: 1005568 kB

CPU使用情况:

import os


def get_cpu_load():
""" Returns a list CPU Loads"""
result = []
cmd = "WMIC CPU GET LoadPercentage "
response = os.popen(cmd + ' 2>&1','r').read().strip().split("\r\n")
for load in response[1:]:
result.append(int(load))
return result


if __name__ == '__main__':
print get_cpu_load()

基于cpu使用代码@Hrabal,这是我使用的:

from subprocess import Popen, PIPE


def get_cpu_usage():
''' Get CPU usage on Linux by reading /proc/stat '''


sub = Popen(('grep', 'cpu', '/proc/stat'), stdout=PIPE, stderr=PIPE)
top_vals = [int(val) for val in sub.communicate()[0].split('\n')[0].split[1:5]]


return (top_vals[0] + top_vals[2]) * 100. /(top_vals[0] + top_vals[2] + top_vals[3])
  • CPU详细信息使用psutil

    https://psutil.readthedocs.io/en/latest/#cpu

    李< /引用> < / >
  • 对于RAM频率(以MHz为单位),使用内置的Linux库dmidecode并对输出进行操作;)。此命令需要root权限,因此也需要提供您的密码。只需复制以下推荐替换 mpass 与您的密码

< p > import os < br > < br > os.system("echo mypass | sudo -S dmidecode -t memory | grep 'Clock Speed' | cut -d ':' -f2") < / p > < p >------------------- 输出 ---------------------------< br > 1600 MT/s
未知的< br > 1600 MT/s
未知0

  • 更确切地说
    [i for i in os.popen("echo mypass | sudo -S dmidecode -t memory | grep 'Clock Speed' | cut -d ':' -f2").read().split(' ') if i.isdigit()] < / >
< p >-------------------------- 输出 ------------------------- < br > (' 1600 ', ' 1600 '] < / p >

为了获得程序的逐行内存和时间分析,我建议使用memory_profilerline_profiler

安装:

# Time profiler
$ pip install line_profiler
# Memory profiler
$ pip install memory_profiler
# Install the dependency for a faster analysis
$ pip install psutil

常见的部分是,通过使用各自的装饰器指定要分析的函数。

示例:我的Python文件main.py中有几个函数,我想分析它们。其中一个是linearRegressionfit()。我需要使用装饰器@profile,它可以帮助我分析这两方面的代码:内存。

对函数定义进行以下更改

@profile
def linearRegressionfit(Xt,Yt,Xts,Yts):
lr=LinearRegression()
model=lr.fit(Xt,Yt)
predict=lr.predict(Xts)
# More Code

时间分析,

运行:

$ kernprof -l -v main.py

输出

Total time: 0.181071 s
File: main.py
Function: linearRegressionfit at line 35


Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
35                                           @profile
36                                           def linearRegressionfit(Xt,Yt,Xts,Yts):
37         1         52.0     52.0      0.1      lr=LinearRegression()
38         1      28942.0  28942.0     75.2      model=lr.fit(Xt,Yt)
39         1       1347.0   1347.0      3.5      predict=lr.predict(Xts)
40
41         1       4924.0   4924.0     12.8      print("train Accuracy",lr.score(Xt,Yt))
42         1       3242.0   3242.0      8.4      print("test Accuracy",lr.score(Xts,Yts))

内存分析,

运行:

$ python -m memory_profiler main.py

输出

Filename: main.py


Line #    Mem usage    Increment   Line Contents
================================================
35  125.992 MiB  125.992 MiB   @profile
36                             def linearRegressionfit(Xt,Yt,Xts,Yts):
37  125.992 MiB    0.000 MiB       lr=LinearRegression()
38  130.547 MiB    4.555 MiB       model=lr.fit(Xt,Yt)
39  130.547 MiB    0.000 MiB       predict=lr.predict(Xts)
40
41  130.547 MiB    0.000 MiB       print("train Accuracy",lr.score(Xt,Yt))
42  130.547 MiB    0.000 MiB       print("test Accuracy",lr.score(Xts,Yts))

同样,内存分析器的结果也可以使用matplotlib using来绘制

$ mprof run main.py
$ mprof plot

enter image description here 注:测试在

line_profiler version == 3.0.2

memory_profiler version == 0.57.0

psutil version == 5.7.0


EDIT:分析器的结果可以使用TAMPPA包进行解析。使用它,我们可以逐行得到所需的图 plot

从第一反应中获得反馈,并做一些小的改变

#!/usr/bin/env python
#Execute commond on windows machine to install psutil>>>>python -m pip install psutil
import psutil


print ('                                                                   ')
print ('----------------------CPU Information summary----------------------')
print ('                                                                   ')


# gives a single float value
vcc=psutil.cpu_count()
print ('Total number of CPUs :',vcc)


vcpu=psutil.cpu_percent()
print ('Total CPUs utilized percentage :',vcpu,'%')


print ('                                                                   ')
print ('----------------------RAM Information summary----------------------')
print ('                                                                   ')
# you can convert that object to a dictionary
#print(dict(psutil.virtual_memory()._asdict()))
# gives an object with many fields
vvm=psutil.virtual_memory()


x=dict(psutil.virtual_memory()._asdict())


def forloop():
for i in x:
print (i,"--",x[i]/1024/1024/1024)#Output will be printed in GBs


forloop()
print ('                                                                   ')
print ('----------------------RAM Utilization summary----------------------')
print ('                                                                   ')
# you can have the percentage of used RAM
print('Percentage of used RAM :',psutil.virtual_memory().percent,'%')
#79.2
# you can calculate percentage of available memory
print('Percentage of available RAM :',psutil.virtual_memory().available * 100 / psutil.virtual_memory().total,'%')
#20.8

你可以读取/proc/meminfo来获得使用的内存

file1 = open('/proc/meminfo', 'r')


for line in file1:
if 'MemTotal' in line:
x = line.split()
memTotal = int(x[1])
        

if 'Buffers' in line:
x = line.split()
buffers = int(x[1])
        

if 'Cached' in line and 'SwapCached' not in line:
x = line.split()
cached = int(x[1])
    

if 'MemFree' in line:
x = line.split()
memFree = int(x[1])


file1.close()


percentage_used = int ( ( memTotal - (buffers + cached + memFree) ) / memTotal * 100 )
print(percentage_used)

这个集合了所有的好东西: psutil + os获取Unix &Windows的兼容性: 这允许我们得到:

  1. CPU
  2. 内存
  3. 磁盘

代码:

import os
import psutil  # need: pip install psutil


In [32]: psutil.virtual_memory()
Out[32]: svmem(total=6247907328, available=2502328320, percent=59.9, used=3327135744, free=167067648, active=3671199744, inactive=1662668800,     buffers=844783616, cached=1908920320, shared=123912192, slab=613048320)


In [33]: psutil.virtual_memory().percent
Out[33]: 60.0


In [34]: psutil.cpu_percent()
Out[34]: 5.5


In [35]: os.sep
Out[35]: '/'


In [36]: psutil.disk_usage(os.sep)
Out[36]: sdiskusage(total=50190790656, used=41343860736, free=6467502080, percent=86.5)


In [37]: psutil.disk_usage(os.sep).percent
Out[37]: 86.5

使用crontab运行不会打印pid

设置:*/1 * * * * sh dog.sh这一行在crontab -e

import os
import re


CUT_OFF = 90


def get_cpu_load():
cmd = "ps -Ao user,uid,comm,pid,pcpu --sort=-pcpu | head -n 2 | tail -1"
response = os.popen(cmd, 'r').read()
arr = re.findall(r'\S+', response)
print(arr)
needKill = float(arr[-1]) > CUT_OFF
if needKill:
r = os.popen(f"kill -9 {arr[-2]}")
print('kill:', r)


if __name__ == '__main__':
# Test CPU with
# $ stress --cpu 1
# crontab -e
# Every 1 min
# */1 * * * * sh dog.sh
# ctlr o, ctlr x
# crontab -l
print(get_cpu_load())

可以通过组合tqdmpsutil来获得实时的CPU和RAM监控。当运行繁重的计算/处理时,它可能很方便。

cli cpu and ram usage progress bars

它也可以在Jupyter中工作,无需任何代码更改:

Jupyter cpu and ram usage progress bars

from tqdm import tqdm
from time import sleep
import psutil


with tqdm(total=100, desc='cpu%', position=1) as cpubar, tqdm(total=100, desc='ram%', position=0) as rambar:
while True:
rambar.n=psutil.virtual_memory().percent
cpubar.n=psutil.cpu_percent()
rambar.refresh()
cpubar.refresh()
sleep(0.5)

使用多处理库将这些进度条放在单独的进程中是很方便的。

这个代码片段也是可用作主旨

@CodeGench解决方案不需要shell,因此假设Linux和Python的标准库:

def cpu_load():
with open("/proc/stat", "r") as stat:
(key, user, nice, system, idle, _) = (stat.readline().split(None, 5))
assert key == "cpu", "'cpu ...' should be the first line in /proc/stat"
busy = int(user) + int(nice) + int(system)
return 100 * busy / (busy + int(idle))


你可以使用pip install SystemScripter命令来使用最近发布的SystemScripter库。这是一个使用其他库(如psutil)来创建从CPU到磁盘信息的完整系统信息库的库。 对于当前CPU使用率,使用函数:

SystemScripter.CPU.CpuPerCurrentUtil(SystemScripter.CPU()) #class init as self param if not work

这是使用百分比或使用情况:

SystemScripter.CPU.CpuCurrentUtil(SystemScripter.CPU())

https://pypi.org/project/SystemScripter/#description