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

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

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

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


当前回答

通过结合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)

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

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

其他回答

使用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示例。

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

你可以在subprocess中使用psutil或psmem 示例代码

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

@CodeGench的解决方案不需要外壳,所以假设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))

要逐行分析程序的内存和时间,我建议使用memory_profiler和line_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

对于时间分析,

Run:

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

对于内存剖析,

Run:

$ 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

注:测试于

Line_profiler version == 3.0.2

Memory_profiler version == 0.57.0

Psutil版本== 5.7.0


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