Es kommt immer wieder vor, dass wir das Betriebssystem oder auch die Prozessorarchitektur erkennen wollen, um unsere Software für ein Betriebssystem einzuschränken oder zu optimieren in der Performance. Zum Beispiel, wenn wir den Apple M1 Pro erkennen wollen oder auch Chips von AMD oder Intel, der verwendet wird. Diese ist zum Beispiel auch interessant, um einen spezifischen System-Bericht für das Debuggen eines Fehlers erstellen zu können. In diesem Artikel stelle ich dir verschiedene Pakete vor, um diese Use Cases bewältigen zu können.
Das System kann am besten mit dem Python Modul „platform“ abgefragt werden. Besonderheit hier ist, dass bei macOS als Name je nach verwenden Paket und Variable Darwin
ausgeben wird und nicht wie zu erwarten macOS, dies liegt daran, dass der macOS-Kernel von ein Darwin System ist.
system = platform.system() # Ausgabe z.B: Darwin, Linux, Windows
Für den Fall das du macOS als Namen erhalten möchtest, müsstest du diese entsprechende mit einer if Abfrage prüfen und Überschreiben. In der Regel kannst du dieses auch einfach tun, ein echtes Darwin System kommt selten vor, da es keine bekannte Distribution gibt, die Darwin als Kernel nutzt außer macOS. Darwin on ARM (letztes Update 2017), PureDarwin, OpenDarwin (eingestellt 2006) sind alles 3 Darwin Projekte, bis auf PureDarwin werden die anderen nicht mehr weiter gepflegt.
Das ist nicht alles, was man aus dem Plattform-Modul mitnehmen kann, weitere Punkte kommen in den verschiedenen Bereichen, die wir noch durchgehen werden.
Eine Information, die wir mit Python nicht so gut erhalten können, sind die Namen und Bezeichner der CPU. Dafür gibt es aber Abhilfe mit dem cpuinfo Paket.
Zum Installieren kannst du den Befehl pip install py-cpuinfo
verwenden, mehr zu pip erfährst du im Artikel „Wie du PIP Installieren und Verwenden kannst?“
Anschließend kannst du auf spezifischere Daten zugreifen:
Wenn ich mein Apple MacBook als Beispiel nehme, sind die verfügbaren Daten sehr begrenzt und bieten nur wenige Informationen über die CPU. Das bedeutet, dass ich als Programmierer weniger Einblick in die CPU meines Geräts habe.
"cpu": {
"python_version": "3.11.0.final.0 (64 bit)",
"cpuinfo_version": [9,0,0],
"cpuinfo_version_string": "9.0.0",
"arch": "ARM_8",
"bits": 64,
"count": 10,
"arch_string_raw": "arm64",
"brand_raw": "Apple M1 Pro"
},
Im Gegensatz dazu bietet mein Asus TUF Gaming F17 FX707 viel mehr Informationen als das zuvor erwähnte Gerät. Zum Beispiel sind hier detaillierte Informationen zu den CPU-Flags und den Herz-Zahlen verfügbar. Das bedeutet, dass ich als Benutzer mehr Kontrolle und Einblick in die CPU Optionen meines Geräts habe.
"cpu": {
"arch": "X86_64",
"arch_string_raw": "AMD64",
"bits": 64,
"brand_raw": "12th Gen Intel(R) Core(TM) i7-12700H",
"count": 20,
"cpuinfo_version": [9,0,0],
"cpuinfo_version_string": "9.0.0",
"family": 6,
"flags": [
"3dnow",
"3dnowprefetch",
"abm",
...
],
"hz_actual": [
2300000000,
0
],
"hz_actual_friendly": "2.3000 GHz",
"hz_advertised": [
2688000000,
0
],
"hz_advertised_friendly": "2.6880 GHz",
"l2_cache_associativity": 7,
"l2_cache_line_size": 1280,
"l2_cache_size": 7864320,
"l3_cache_size": 25165824,
"model": 154,
"python_version": "3.10.10.final.0 (64 bit)",
"stepping": 3,
"vendor_id_raw": "GenuineIntel"
},
Um auf diese Daten zuzugreifen, ist der Python-Code sehr einfach und leicht verständlich. Alles, was wir machen müssen, ist das Paket cpuinfo
zu importieren und auf die Methode get_cpu_info
zuzugreifen. Dadurch erhalten wir die aktuellen Daten zu unserer CPU.
import cpuinfo
cpuData = cpuinfo.get_cpu_info()
Wichtig: Wie du oben gesehen hast, können je nach System andere Werte in dem Dictionary vorhanden sein. Deshalb solltest du, falls du die Werte nicht nur in einen System-Bericht alle Schreiben willst, definitiv prüfen, ob alle Werte korrekt und wie gewünscht gesetzt sind.
In diesem Abschnitt betrachten wir nun den Arbeitsspeicher. Zum einen wollen wir prüfen, wie viel Arbeitsspeicher wir zur Verfügung haben und wie viel noch verfügbar ist.
Um an die Daten für den Arbeitsspeicher zu kommen, arbeiten wir mit dem Paket psutil diese ist gerade für Echtzeit Daten sehr Interessant und gibt uns viele Optionen.
Installiert wird das Paket mittels pip install psutil
anschließend kannst du es auch direkt verwenden.
Der Used Memory ist nicht (total - available)
, sondern wird intern vom System berechnet. Da jedoch percent
auf dieser Gleichung basiert, kannst du den used
Memory nicht mit dem available addieren, um wieder das gesamte Ergebnis zu erhalten.
import psutil
data = psutil.virtual_memory()
print(data)
# Return system memory
# svmem(total=17179869184,
# available=4893376512,
# percent=71.5,
# used=7443972096,
# free=50905088,
# active=4874747904,
# inactive=4621582336,
# wired=2569224192)
Das psutil Modul ist nicht nur für den RAM nützlich, auch Informationen über die folgende (Hardware) Komponenten können abgerufen werden: CPU, Arbeitsspeicher, Swap, Festplatten, Netzwerk, Prozessinformationen und noch weitere.
Diese im Detail alle zu erklären würde hier den Rahmen etwas sprengen, in einem abschließenden Beispiel findet ihr noch einmal eine Funktion, um ein möglichst umfassenden System-Bericht zu generieren.
Ein System-Bericht kann unterschiedlichste Daten erhalten, ich habe mich nun für die entschieden, die wir im Artikel vorgestellt haben, zusätzlich auch noch einmal der Festplattenspeicher. Beachten sollte man dort auch wieder, dass die usage Informationen sehr abweichend sind, weshalb ich mich hier für eine eigenständige Berechnung entschieden habe, da diese näher an den Werten ist, die mir verschieden Tools meines Systems ausgegeben habe.
import platform,json,psutil,cpuinfo
def getSystemInfo():
systemInfo = {}
pName = platform.uname().system
if "darwin" in pName.lower():
pName = "macOS"
# System Informationen
systemInfo["os"] = pName
systemInfo["osVersion"] = platform.uname().release
systemInfo["osArch"] = platform.uname().machine
# CPU Informationen
systemInfo["cpu"] = cpuinfo.get_cpu_info()["brand_raw"]
systemInfo["cpuCores"] = psutil.cpu_count(logical=False)
systemInfo["cpuThreads"] = psutil.cpu_count(logical=True)
# RAM Informationen
ram = psutil.virtual_memory()
systemInfo["ram"] = ram.total / 1024**3
systemInfo["ramUsed"] = (ram.total - ram.available) / 1024**3
systemInfo["ramAvailable"] = ram.available / 1024**3
systemInfo["ramPercent"] = ram.percent
# Disk Informationen
disk = psutil.disk_usage("/")
systemInfo["disk"] = disk.total / 1024**3
systemInfo["diskUsed"] = (disk.total - disk.free) / 1024**3
systemInfo["diskFree"] = disk.free / 1024**3
systemInfo["diskPercent"] = disk.percent
return systemInfo
if __name__ == '__main__':
info = getSystemInfo()
print(json.dumps(info, indent=4))
Eine mögliche Ausgabe der Daten könnte wie im folgenden Beispiel JSON aussehen.
{
"os": "macOS",
"osVersion": "22.2.0",
"osArch": "arm64",
"cpu": "Apple M1 Pro",
"cpuCores": 10,
"cpuThreads": 10,
"ram": 16.0,
"ramUsed": 11.845428466796875,
"ramAvailable": 4.154571533203125,
"ramPercent": 74.0,
"disk": 994.66258432,
"diskUsed": 387.456016384,
"diskFree": 607.206567936,
"diskPercent": 1.4
}
In Python kann man wirklich einfach auf die Systemebene zugreifen über verschiedenste Schnittstellen und zusätzlich gibt es viele Pakete wie cpuinfo und psutil die es dir vereinfachen an diese Daten heranzukommen, egal ob du auf Linux, MacOS oder Windows unterwegs bist.
Hinterlasse mir gerne einen Kommentar zum Artikel und wie er dir weitergeholfen hat beziehungsweise, was dir helfen würde das Thema besser zu verstehen. Oder hast du einen Fehler entdeckt, den ich korrigieren sollte? Schreibe mir auch dazu gerne ein Feedback!
Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "Python: So liest du System- und Hardware-Informationen aus!"!