Knowledge Hub
Tools & InfraIntermediateterminal

Aufgabe — Dein erstes Python-CLI-Projekt

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 Programm
  • aufgaben.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

  1. python cli.py add "Titel"
    Fügt eine neue Aufgabe hinzu und speichert sie in aufgaben.json.
    Jede Aufgabe soll mindestens haben: id, titel, erledigt (True/False).

  2. python cli.py list
    Zeigt alle gespeicherten Aufgaben an, z.B.:

    [1] Wäsche waschen - offen
    [2] Einkaufen - erledigt
    
  3. python cli.py done 1
    Markiert die Aufgabe mit der ID 1 als erledigt (in der JSON-Datei aktualisieren).

  4. 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)

  1. python cli.py remove 1 — löscht eine Aufgabe anhand der ID.
  2. python cli.py list --nur-offene — zeigt nur nicht-erledigte Aufgaben (optionales Flag).
  3. Fehlerbehandlung: Was passiert, wenn done 99 aufgerufen 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:

  1. Zuerst: Funktionen aufgaben_laden() und aufgaben_speichern(liste), die die JSON-Datei lesen/schreiben — teste sie isoliert, bevor irgendwas mit argparse passiert.
  2. Dann: argparse-Grundgerüst nur mit dem add-Befehl bauen und testen.
  3. Danach: list-Befehl ergänzen.
  4. Danach: done-Befehl ergänzen.
  5. 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 id für eine neue Aufgabe?
  • Wie findest du die Aufgabe mit einer bestimmten id in 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.