Hat euch die traurige Nachricht auch kalt erwischt? Neofetch ist nicht mehr! Man kann es natürlich noch nutzen, und wenn es genauso lange dauert, ein Paket aus den Debian-Repos zu entfernen, wie es aufzunehmen, wird Neofetch uns auch noch eine Weile erhalten bleiben. Ralf hat schon in seinem Artikel bestehende Alternativen erwähnt.
Ich habe das mal zum Anlass genommen, eine billige Kopie in Python zu schreiben. Warum billig? Weil das hier ein kleiner Appetitanreger für Python-Interessierte sein soll, die mit dem Gedanken spielen, diese Programmiersprache zu erlernen. Es soll also einfach sein. Ich beschränke mich hier durch die Auflistung von DEBIAN-PAKETEN logischerweise nur auf Debian und seine Derivate. Die schöne ASCII-Art fällt auch weg. Mich interessieren nur die rohen Daten. Was auch fehlt, sind Desktop-spezifische Daten. Das könnten wir auch einfügen, würde aber das Testen auf mehreren Desktop-Umgebungen voraussetzen und uns direkt in die "IF/ELSE-STATEMENT-HÖLLE" bringen. Da wollt ihr als Anfänger nicht rein, glaubt mir. Auch die Berechnung des RAMs habe ich weggelassen. Das ist zu viel Mathematik.
Den folgenden Code können wir in einer Datei mit dem Namen "fetch_data.py" an einem beliebigen Ort abspeichern. Der Einfachheit halber direkt im HOME
. Im Terminal könnt ihr das Ergebnis sehen, indem ihr python3 fetch_data.py
eingebt und mit ENTER bestätigt.
import os
import subprocess
import socket
import platform
import psutil
# Get User and Host
user = os.getlogin()
hostname = socket.gethostname()
print(f"{user}&{hostname}")
total_string = len(user) + len(hostname) +1
print("-" * total_string)
# Get Name of Distro
os_release = subprocess.run(["grep", "-E", "^(PRETTY_NAME)=", "/etc/os-release"], stdout=subprocess.PIPE, text=True)
nice_name = os_release.stdout.strip().split('=')[1].strip('"')
print(f"OS: {nice_name}")
# Get Kernel Release
kernel_release = platform.release()
print(f"Kernel: {kernel_release}")
# Get installed Debian Packages
deb_count = subprocess.run(["dpkg", "--list"], stdout=subprocess.PIPE, text=True)
deb_counted = len(deb_count.stdout.splitlines()) - 5
print(f"Packages: {deb_counted} (Debian)")
# Get used Shell
get_shell = os.environ["SHELL"]
print(f"Shell: {get_shell}")
# Get Screen Resolution
get_resolution = subprocess.run(["xrandr"], stdout=subprocess.PIPE, text=True)
resolution_lines = get_resolution.stdout.splitlines()
resolution = [line.split()[0] for line in resolution_lines if "*" in line]
print(f"Resolution: {' '.join(resolution)}")
# Get Max CPU Frequency
cpufreq = psutil.cpu_freq()
print(f"CPU: {cpufreq.max:.0f} Mhz")
Um es wirklich einfach zu halten, habe ich mich überwiegend auf Module beschränkt, die in Python enthalten sind. Je nach Derivat kann es sein, dass man python3-psutil
nachinstallieren muss. Was folgt, ist eine nette Auswahl an Mechaniken, um das System auszulesen. Eine kleine Spielerei findet ihr in total_string
. Hier habe ich mit len
die Buchstaben von user
und hostname
zusammengezählt, damit die gestrichelte Linie immer die richtige Länge hat. Falls ihr Interesse habt, Python zu lernen, kann ich euch, ohne große Werbung zu machen, das Buch Python 3 Das umfassende Handbuch von Rheinwerk empfehlen.
Hier noch einmal eine etwas genauere Auflistung der Geschehnisse:
-
Benutzername und Hostname abrufen:
user = os.getlogin()
: Ruft den Benutzernamen des aktuellen Benutzers ab.hostname = socket.gethostname()
: Ruft den Hostnamen des Systems ab.print(f"{user}&{hostname}")
: Druckt den Benutzernamen und den Hostnamen.
-
Zeichenfolge für Trennlinie erstellen:
total_string = len(user) + len(hostname)
: Berechnet die Gesamtlänge der Zeichenfolge aus Benutzername und Hostname.print("-" * total_string)
: Druckt eine Zeichenfolge von Bindestrichen mit der berechneten Länge aus, um eine Trennlinie zu erstellen.
-
Name des Betriebssystems abrufen:
os_release = subprocess.run(["grep", "-E", "^(PRETTY_NAME)=", "/etc/os-release"], stdout=subprocess.PIPE, text=True)
: Führt den Befehlgrep
aus, um die Zeile aus der Datei/etc/os-release
zu finden, die mit "PRETTY_NAME" beginnt. Das Ergebnis wird übersubprocess.PIPE
abgerufen.nice_name = os_release.stdout.strip().split('=')[1].strip('"')
: Verarbeitet den Ausgabestring, um den Namen des Betriebssystems zu extrahieren.
-
Kernelversion abrufen:
kernel_release = platform.release()
: Ruft die Kernelversion des Betriebssystems ab.
-
Anzahl der installierten Debian-Pakete abrufen:
deb_count = subprocess.run(["dpkg", "--list"], stdout=subprocess.PIPE, text=True)
: Führt den Befehldpkg --list
aus, um die Liste der installierten Pakete abzurufen. Das Ergebnis wird übersubprocess.PIPE
abgerufen.deb_counted = len(deb_count.stdout.splitlines()) - 5
: Zählt die Anzahl der Zeilen in der Ausgabe und subtrahiert die Header-Zeilen, um die Anzahl der installierten Pakete zu erhalten.
-
Verwendete Shell abrufen:
get_shell = os.environ["SHELL"]
: Ruft den Pfad zur verwendeten Shell aus der UmgebungsvariableSHELL
ab.
-
Bildschirmauflösung abrufen:
get_resolution = subprocess.run(["xrandr"], stdout=subprocess.PIPE, text=True)
: Führt den Befehlxrandr
aus, um Informationen zur Bildschirmauflösung abzurufen. Das Ergebnis wird übersubprocess.PIPE
abgerufen.resolution_lines = get_resolution.stdout.splitlines()
: Teilt die Ausgabe in Zeilen auf.resolution = [line.split()[0] for line in resolution_lines if "*" in line]
: Durchsucht die Zeilen nach denen, die ein Sternchen enthalten, und extrahiert den ersten Wert, der normalerweise den Namen des Ausgabegeräts enthält.
-
Maximale CPU-Frequenz abrufen:
cpufreq = psutil.cpu_freq()
: Ruft Informationen zur CPU-Frequenz mit derpsutil
-Bibliothek ab.
Quellen:
https://stackoverflow.com/questions/3103178/how-to-get-the-system-info-with-python
https://thepythoncode.com/article/get-hardware-system-information-python
https://www.askpython.com/python/examples/retrieve-screen-resolution-in-python
https://www.baeldung.com/linux/screen-resolution
https://s3.dualstack.us-east-2.amazonaws.com/pythondotorg-assets/media/community/logos/python-logo-only.png
Nette Idee! Die Anzahl der wirklich installierten Pakete (mit dem Vorteil, dass die Header-Zeilen wegbleiben):
Noch sicherer ohne Header (wenn aptitude installiert):
Ich habe es ohne python-psutil gemacht, weil die Linux Befehle alle schon vorhanden sind. Somit habe ich es mir etwas sehr leicht gemacht. Jedenfalls im nachfolgenden ist mein Code Beispiel für ein kleines NeoFetchPythonSkript:
Ich weiß nicht warum jetzt die Anführungszeichen codiert wurden. Aber für alle, die es nicht wissen. Mit einen beliebigen Texteditor alle '\"\;' ersetzen mit 'double quotes' zu deutsch 'Anführungsstriche'. Auf der deutschentastatur die 2 mit der Shift-Taste.
Dein Code crasht, weil uptime.strip() Stunden und Minuten erwartet. In meinem Fall ist der PC 20 Minuten. Der Output ist "20 Min", nicht 0 Stunden 20 Minuten
Daran habe ich nicht gedacht, wenn der Rechner noch keine Stunde läuft. Mein Fehler und hier die Lösung:
Eine saubere Lösung wäre dies hier:
Jeweils vordem python-code
hours, minutes = uptime.strip()....
setzen Variante 01 oder Variante 02. Danach sollte es auch bei Dir funktionieren @kamome.Danke @Claudia, allerdings kam das von Actionschnitzel, nicht von mir ;)
Ich hätte noch eine dritte Möglichkeit in peto, somit würde es ein zwei Zeiler bleiben:
Erklärung für den awk-commando:
Ich hoffe, dass dies als Erklärung reicht, ansonsten einfach mal die Manual-Page öffnen von awk-commando:
man awk
.P.S.: Ich bitte um Entschuldigung, dass dies nicht gleich alles in der ersten Antwort enthalten war. Diese Entschuldigung geht an alle Leser und Leserinnen und den Verwaltern und Verwalterinnen, die meine Antwort ständig freigeben müssen.
Mein kleiner Tick, wenn es nicht funktioniert. Dann muss ich solange herumbasteln bis es funktioniert.
Cool. Habe die selbe Idee in rust implementiert, auch wenn manche Infos noch fehlen: https://github.com/oliverpk2000/rust-fetch