argparse_subcommand, ein sehr einfaches Framework
Ziel
- Ich verstehe, was ein Framework ausmacht und habe eines ausprobiert.
- Ich kann mit
argparse_subcommand
aufgeräumte Kommandozeilenprogramme mit mehreren Unterkommandos schreiben. - Ich habe die Programmstruktur für mehrere nachfolgende Aufgaben angelegt.
Hintergrund
Das Modul argparse
ist schick, um Kommandozeilen mit zahlreichen Optionen gut verarbeiten zu können.
Wenn das Kommando allerdings mehrere Unterkommandos hat
(wie z.B. git
mit seinen Befehlen add
, commit
, push
usw.)
wird es kompliziert: Dann muss man je nach gegebenem Unterkommandonamen
den ArgumentParser
ganz anders konfigurieren.
argparse_subcommand
ist ein klitzekleines Framework, um das zu vereinfachen.
Es gibt eine feste Programmstruktur für die Unterkommandos vor, was beim Programmieren
ein bisschen Code einspart, vor allem aber zu einer immer gleichen und deshalb schnell verständlichen
Gesamtstruktur führt.
In dieser Aufgabe lernen wir argparse_subcommand
sowohl, um zu verstehen, was ein Framework ist,
als auch als nettes Hilfsmittel für späteres Programmieren.
Arbeitsschritte
Installieren
In argparse_subcommand
einlesen: Was ist ein Framework?
- Lesen und verstehen Sie die kurze
Dokumentation von
argparse_subcommand
.
Der Frameworkcharakter besteht darin, dass der Aufruf vonparser.execute_subcommand(args)
(dieser Teil steht im Hauptprogramm Ihres Programms) bewirkt, dass in einem der subcommand-Moduleexecute(args)
aufgerufen wird, ohne, dass Sie einen solchen Aufruf irgendwo hingeschrieben hätten.
mlh
: Struktur aufbauen
- Legen Sie einen Ordner
mlh
an. mlh steht für "my little helpers" und ist der Name des Programms, das wir in den nachfolgenden Aufgaben dieser Aufgabengruppe entwickeln werden.
In einer Standard-Python-Paketstruktur ist dies der Projektordner. - Legen Sie in diesem Ordner einen Unterordner gleichen Namens,
mlh
, an und darin eine leere Datei__init__.py
. Das macht den Ordner zu einem Python-Modul, Dieses Modul bildet den Namensraum (mlh
), in dem wir überwiegend programmieren wollen. Wenn wir eine Bibliothek bauen würden (nicht ein Kommandozeilen-Programm), würde sich alles in diesem Modul abspielen. In unserem Fall brauchen wir aber noch ein Hauptprogramm: - Legen Sie in diesem Unterordner die Datei
__main__.py
an und implementieren Sie darin das kurze Hauptprogramm wie in der Dokumentation vonargparse_subcommand
beschrieben.
Ergänzen Sie darin den fehlenden Import, sowie
explanation = "My Little Helpers: a collection of small utility programs"
- Legen Sie ein Untermodul
mlh.subcmds
für die subcommands an: Unterordnersubcmds
, Datei__init__.py
.
__init__.py
legt die Schnittstelle des Moduls fest und bleibt bei uns leer, weil wir nur an den Unter-Untermodulen interessiert sind, nicht ansubcmds
selbst. - Legen Sie darin zwei Dateien
gitac.py
undlsnew.py
an; das werden die beiden ersten Subcommands für mlh. Kopieren Sie in jede der Dateien den subcommand-Modul-Basiscode aus derargparse_subcommand
-Dokumentation und formatieren Sie ihn ordentlich. - 1 Rufen Sie
python mlh
auf und überzeugen Sie sich, dass beide Unterkommandos vom Framework korrekt erkannt werden. - 2 Rufen Sie
python mlh gitac
auf und überzeugen Sie sich, dass das Unterkommando aufgerufen werden kann (und natürlich noch gar nichts tut).
mlh
: Struktur ausprägen
In dieser Aufgabe legen wir erst mal nur die Kommandostruktur der beiden Unterkommandos an, aber noch ohne richtige Implementierung.
- Tragen Sie als Implementierung von
execute
bei beiden Unterkommandos ein
print(args)
. - 3 Rufen Sie erneut
python mlh gitac
auf und überzeugen Sie sich, dass die gewünschte Meldung erscheint. - Ergänzen Sie nun
subcmds.gitac.add_arguments()
so, dass Sie aufpython mlh gitac --help
die Hilfezeile "usage: mlh gitac [-h] [-m commit msg] file [file …]" erhalten und alternativ auch--message
anstatt-m
akzeptiert wird. - 4 Zeigen Sie folgende gültige Kommandos und ihre Ausgaben:
python mlh gitac file1
python mlh gitac file1 file2
python mlh gitac -m "my commit message" file1 file2
python mlh gitac --message "other msg" file1 file2 file3
- 5 Zeigen Sie folgende ungültige Kommandos und ihre Ausgaben:
python mlh gitac
python mlh gitac -m file1
- Ergänzen Sie nun
subcmds.lsnew.add_arguments()
so, dass Sie aufpython mlh lsnew --help
die Hilfezeile "usage: mlh lsnew [-h] [–age maxage] file [file …]" erhalten undage
den Standardwert "48h" hat`. - 6 Zeigen Sie folgende gültige Kommandos und ihre Ausgaben:
python mlh lsnew file1
python mlh lsnew --age 30s file1 file2
Abgabe
Geben Sie ein Kommandoprotokoll ab, das genau nur die Eingaben und Ausgaben der obigen Kommandos 1, 2, … enthält. Entfernen Sie vor Abgabe eventuelle Fehlversuche und sonstige zusätzliche Kommandos aus dem Protokoll.
Geben Sie den Dateibaum mlh
mit seinen diversen *.py
-Dateien ab.