Aufgabe: Dein erstes Python-CLI-Projekt
Du baust ein kleines Kommandozeilen-Tool (CLI = Command Line Interface) – ein Programm, das man über das Terminal mit Befehlen und Optionen bedient, z.B. so wie git status oder git commit -m "...".
Ziel-Tool: ein Aufgaben-Manager, den du später so aufrufst:
python cli.py add "Wäsche waschen"
python cli.py list
python cli.py done 1
Teil 1: Projekt-Setup im Terminal (Schritt für Schritt)
Schritt 1 – Projektordner anlegen
mkdir aufgaben-cli
cd aufgaben-cli
Schritt 2 – Virtuelle Umgebung anlegen & aktivieren
python3 -m venv venv
source venv/bin/activate
Du erkennst die Aktivierung am (venv) vor deiner Terminal-Zeile.
Schritt 3 – Projektdateien anlegen
touch cli.py
touch aufgaben.json
cli.py→ dein eigentliches Programmaufgaben.json→ hier speicherst du die Aufgaben dauerhaft (auch nach Programmende)
In aufgaben.json schreibst du am Anfang manuell eine leere Liste rein:
[]
Schritt 4 – Git initialisieren (optional, aber gute Übung)
git init
echo "venv/" > .gitignore
git add .
git commit -m "Projekt-Setup CLI-Tool"
Schritt 5 – Grundgerüst testen
Schreib testweise in cli.py:
print("CLI läuft!")
Dann im Terminal ausführen:
python cli.py
Wenn "CLI läuft!" erscheint, ist dein Setup korrekt.
Teil 2: Was du für die Aufgabe brauchst
Das eingebaute Modul argparse – damit liest Python die Befehle/Argumente ein, die du im Terminal nach python cli.py eintippst. Kein pip install nötig, ist Teil der Standardbibliothek.
Minimal-Grundgerüst, um zu verstehen wie argparse funktioniert (das ist noch NICHT die Lösung deiner Aufgabe, nur ein Beispiel zum Verstehen des Prinzips):
import argparse
parser = argparse.ArgumentParser(description="Ein Beispiel-CLI")
parser.add_argument("name", help="Dein Name")
args = parser.parse_args()
print(f"Hallo {args.name}!")
Aufruf im Terminal:
python cli.py Nalan
# Ausgabe: Hallo Nalan!
Für mehrere Befehle (add, list, done) brauchst du Subparsers – das Prinzip dahinter:
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest="befehl")
# Unterbefehl "add"
add_parser = subparsers.add_parser("add")
add_parser.add_argument("titel")
args = parser.parse_args()
if args.befehl == "add":
print(f"Füge hinzu: {args.titel}")
Aufruf:
python cli.py add "Wäsche waschen"
# Ausgabe: Füge hinzu: Wäsche waschen
Das ist bewusst nur ein Mini-Beispiel zum Prinzip verstehen – deine eigentliche Aufgabe ist umfangreicher (siehe unten).
Teil 3: Deine eigentliche Aufgabe
Baue in cli.py einen vollständigen Aufgaben-Manager mit folgenden Anforderungen:
Muss-Anforderungen
-
python cli.py add "Titel"
Fügt eine neue Aufgabe hinzu und speichert sie inaufgaben.json.
Jede Aufgabe soll mindestens haben:id,titel,erledigt(True/False). -
python cli.py list
Zeigt alle gespeicherten Aufgaben an, z.B.:[1] Wäsche waschen - offen [2] Einkaufen - erledigt -
python cli.py done 1
Markiert die Aufgabe mit der ID1als erledigt (in der JSON-Datei aktualisieren). -
Daten müssen persistent sein — nach Neustart des Programms müssen die Aufgaben noch da sein (deshalb
aufgaben.json).
Zusatz-Anforderungen (wenn die Basis läuft)
python cli.py remove 1— löscht eine Aufgabe anhand der ID.python cli.py list --nur-offene— zeigt nur nicht-erledigte Aufgaben (optionales Flag).- Fehlerbehandlung: Was passiert, wenn
done 99aufgerufen wird, aber es keine Aufgabe mit ID 99 gibt? Das Programm soll nicht abstürzen, sondern eine verständliche Meldung zeigen.
Teil 4: Wie du es angehst (Struktur-Tipp, ohne fertigen Code)
Bau dir das Programm in kleinen, testbaren Schritten auf – nach jedem Schritt im Terminal testen, bevor du weitermachst:
- Zuerst: Funktionen
aufgaben_laden()undaufgaben_speichern(liste), die die JSON-Datei lesen/schreiben — teste sie isoliert, bevor irgendwas mitargparsepassiert. - Dann:
argparse-Grundgerüst nur mit demadd-Befehl bauen und testen. - Danach:
list-Befehl ergänzen. - Danach:
done-Befehl ergänzen. - Erst zum Schluss: Zusatz-Anforderungen.
Fragen, die dir beim Strukturieren helfen:
- Welche Funktion ist für "Datei lesen/schreiben" zuständig, welche für "Argumente verarbeiten"? (Trenne diese zwei Verantwortlichkeiten!)
- Woher bekommst du die nächste freie
idfür eine neue Aufgabe? - Wie findest du die Aufgabe mit einer bestimmten
idin deiner geladenen Liste wieder?
Wenn du feststeckst
Sag mir, an welchem der 4 Basis-Schritte (add / list / done / speichern) du gerade bist und was genau nicht funktioniert (Fehlermeldung oder unerwartetes Verhalten) — dann gehen wir das gemeinsam Schritt für Schritt durch, ohne dass ich dir gleich den kompletten Code gebe.