Lerne Coding
Python: So liest du System- und Hardware-Informationen aus!
31.03.2023

Python – die Hardware und das System erkennen

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. 6 Minuten

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.

OS – Betriebssystem Erkennen

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.

CPU – Prozessor Verwendung und Name

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.

Github Logoworkhorsy/py-cpuinfo
300 46 58

A module for getting CPU info with pure Python

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:

  • Architektur
  • Bits
  • Brand / Marke / Name
  • Kerne
  • Flags
  • und viele weitere Daten je nach CPU und System

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.

RAM – Arbeitsspeicher Kapazitäten Erkennen

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.

Python ein System-Bericht Erstellen

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
}

Fazit

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.

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel

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!"!

Kommentar schreiben

Vom Autor Empfohlen
close