518 Stimmen

Wie erhält man die aktuelle CPU- und RAM-Auslastung in Python?

Wie kann ich den aktuellen Systemstatus (aktuelle CPU, RAM, freier Speicherplatz, etc.) in Python abfragen? Idealerweise würde es sowohl für Unix- als auch für Windows-Plattformen funktionieren.

Nach meinen Recherchen scheint es mehrere Möglichkeiten zu geben, diese Informationen zu extrahieren:

  1. Mit einer Bibliothek wie PSI (das derzeit offenbar nicht aktiv entwickelt und nicht auf mehreren Plattformen unterstützt wird) oder etwas wie pystatgrab (auch hier scheint es seit 2007 keine Aktivitäten mehr zu geben und keine Unterstützung für Windows).

  2. Die Verwendung von plattformspezifischem Code, wie z. B. die Verwendung eines os.popen("ps") oder ähnlich für die *nix-Systeme und MEMORYSTATUS in ctypes.windll.kernel32 (siehe dieses Rezept auf ActiveState ) für die Windows-Plattform. Aus all diesen Codeschnipseln könnte man eine Python-Klasse zusammenstellen.

Es ist nicht so, dass diese Methoden schlecht sind, aber gibt es bereits eine gut unterstützte, plattformübergreifende Methode, um das Gleiche zu tun?

0 Stimmen

Sie können Ihre eigene Multiplattform-Bibliothek erstellen, indem Sie dynamische Importe verwenden: "if sys.platform == 'win32': import win_sysstatus as sysstatus; else" ...

1 Stimmen

Es wäre cool, etwas zu haben, das auch auf App Engine funktioniert.

1 Stimmen

Ist das Alter der Verpackungen von Bedeutung? Wenn jemand sie beim ersten Mal richtig gemacht hat, warum sollten sie dann nicht immer noch richtig sein?

618voto

Jon Cage Punkte 34808

Die psutil-Bibliothek gibt Ihnen Informationen über CPU, RAM usw. auf einer Vielzahl von Plattformen:

psutil ist ein Modul, das eine Schnittstelle zum Abrufen von Informationen über laufende Prozesse und die Systemauslastung (CPU, Speicher) in portabler Weise unter Verwendung von Python bereitstellt und viele Funktionen implementiert, die von Tools wie ps, top und dem Windows Task Manager angeboten werden.

Es unterstützt derzeit Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD und NetBSD, sowohl 32-Bit- als auch 64-Bit-Architekturen, mit Python-Versionen von 2.6 bis 3.5 (Benutzer von Python 2.4 und 2.5 können die Version 2.1.3 verwenden).


Einige Beispiele:

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

Hier finden Sie eine weitere Dokumentation, die weitere Konzepte und interessante Konzepte enthält:

42 Stimmen

Hat bei mir unter OSX funktioniert: $ pip install psutil ; >>> import psutil; psutil.cpu_percent() y >>> psutil.virtual_memory() das ein schönes vmem-Objekt zurückgibt: vmem(total=8589934592L, available=4073336832L, percent=52.6, used=5022085120L, free=3560255488L, active=2817949696L, inactive=513081344L, wired=1691054080L)

18 Stimmen

Wie würde man das ohne die psutil-Bibliothek machen?

6 Stimmen

@user1054424 Es gibt eine eingebaute Bibliothek in Python namens Ressource . Es scheint jedoch, dass man damit höchstens den Speicher erfassen kann, den ein einzelner Python-Prozess und/oder seine Kindprozesse verwenden. Es scheint auch nicht sehr genau zu sein. Ein schneller Test zeigte Ressource um etwa 2 MB vom Dienstprogramm meines Macs abweichen.

103voto

wordsforthewise Punkte 10875

Verwenden Sie die psutil-Bibliothek . Auf Ubuntu 18.04 wurde pip 5.5.0 (neueste Version) ab dem 30.1.2019 installiert. Ältere Versionen können sich etwas anders verhalten. Sie können Ihre Version von psutil überprüfen, indem Sie dies in Python tun:

from __future__ import print_function  # for Python2
import psutil
print(psutil.__version__)

Um einige Speicher- und CPU-Statistiken zu erhalten:

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

El virtual_memory (Tupel) enthält den prozentualen Anteil des systemweit genutzten Speichers. Dies schien bei mir auf Ubuntu 18.04 um ein paar Prozent überschätzt zu werden.

Sie können auch den von der aktuellen Python-Instanz verwendeten Speicher abfragen:

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)

die den aktuellen Speicherverbrauch Ihres Python-Skripts anzeigt.

Ausführlichere Beispiele finden sich auf der Website pypi-Seite für psutil .

3 Stimmen

Bitte rufen Sie keine Variablen an py

0 Stimmen

Ich weiß, das ist jetzt nicht die beste Praxis, aber py ist kein Schlüsselwort oder so etwas. Gibt es einen Grund, abgesehen davon, dass es kein beschreibender Variablenname ist, dass Sie sagen, verwenden Sie nicht py ?

6 Stimmen

Es wird allgemein in vielen anderen Zusammenhängen verwendet, um "etwas, das sich auf Python bezieht" zu bezeichnen, z. B. redis-py. Ich würde die zwei Buchstaben py nicht verwenden, um den aktuellen Prozess zu bezeichnen.

90voto

Karol Zlot Punkte 1369

Man kann CPU und RAM in Echtzeit überwachen, indem man Folgendes kombiniert tqdm y psutil . Dies kann bei umfangreichen Berechnungen/Verarbeitungen nützlich sein.

enter image description here

Es funktioniert auch in Jupyter ohne jegliche Codeänderung:

enter image description here

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)

Dieser Codeschnipsel ist auch als Gist verfügbar .

57voto

Hrabal Punkte 2138

Nur für Linux: Einzeiler für die RAM-Nutzung mit nur stdlib-Abhängigkeit:

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

3 Stimmen

Sehr nützlich! Um sie direkt in menschenlesbaren Einheiten zu erhalten: os.popen('free -th').readlines()[-1].split()[1:] . Beachten Sie, dass diese Zeile eine Liste von Zeichenketten zurückgibt.

2 Stimmen

En python:3.8-slim-buster hat nicht free

0 Stimmen

Schauen Sie mal aquí , @MartinThoma.

33voto

CodeGench Punkte 1047

Die folgenden Codes, ohne externe Bibliotheken, haben bei mir funktioniert. Ich habe mit Python 2.7.9 getestet

CPU-Nutzung

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

Und Ram-Nutzung, insgesamt, verwendet und frei

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'

8 Stimmen

Meinen Sie nicht, dass die grep y awk besser durch die Verarbeitung von Zeichenketten in Python bewältigt werden könnte?

1 Stimmen

Da ich mich mit awk nicht auskenne, habe ich eine awkless-Version des folgenden Schnipsels zur CPU-Nutzung erstellt. Sehr praktisch, danke!

10 Stimmen

Es ist unaufrichtig zu sagen, dass dieser Code keine externen Bibliotheken verwendet. In der Tat sind diese stark von der Verfügbarkeit von grep, awk und free abhängig. Das macht den obigen Code nicht portierbar. Der OP sagte: "Bonuspunkte für *nix und Windows-Plattformen".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X