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

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

使用像PSI这样的库(目前似乎没有积极开发,在多个平台上也不支持)或像pystatgrab这样的库(从2007年开始似乎没有活动,也不支持Windows)。 使用平台特定的代码,例如使用os.popen("ps")或*nix系统的类似代码,以及ctypes.windll中的MEMORYSTATUS。Windows平台的kernel32(请参阅ActiveState上的配方)。可以将所有这些代码片段放在一个Python类中。

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


当前回答

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

其他回答

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

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

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

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

使用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 (tuple)将包含系统范围内使用的内存百分比。对我来说,在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示例。

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

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

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)

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

此代码片段也可作为要点。

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

#!/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

基于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])