Python-Kurs / Kommandozeilenargumente mit argparse auswerten
Mit argparse legen Sie die Eingaben eines Kommandozeilenprogramms fest: Parameter, Umwandlung, Standardwerte und erlaubte Optionen. Das Standardmodul erzeugt daraus Hilfe und Fehlermeldungen; halten Sie die Verarbeitung der Argumente möglichst getrennt von der eigentlichen Berechnung.
Positionsargumente und benannte Optionen unterscheiden
Ein Positionsargument wird durch seine Stelle im Aufruf zugeordnet. Im folgenden Programm sind das die Beträge. Eine Option wie --currency wird dagegen über ihren Namen erkannt und erhält hier einen folgenden Wert. nargs="+" verlangt mindestens einen Betrag; es ist kein optionaler leerer Summenlauf.
Die Umwandlungsfunktion nonnegative nimmt Text aus der Kommandozeile entgegen und macht daraus eine Ganzzahl. choices beschränkt die erlaubten Einheiten auf KRW und USD; ohne diese Option wird KRW verwendet. Das ist eine eigene Eingaberegel und keine automatische Erkennung der Herkunft eines Betrags.
Die Shell zerlegt den eingegebenen Befehl bereits vor argparse in einzelne Argumente. Wenn ein Programm später Dateipfade mit Leerzeichen annimmt, müssen solche Pfade in der Shell passend in Anführungszeichen stehen. Optionen machen vertrauliche Werte nicht unsichtbar: Passwörter und Token können in Prozesslisten oder Shell-Verläufen auftauchen und benötigen ein geeignetes getrenntes Eingabe- oder Geheimnisverfahren.
Ein vollständiges Summenprogramm ausführen
Speichern Sie das vollständige Programm als UTF-8-Datei sum_cli.py in einem separaten Übungsordner. Zusätzliche Pakete sind nicht erforderlich. Starten Sie in der Projektumgebung python sum_cli.py 3500 8000 2500. Unter macOS oder Ubuntu kann der Interpreterbefehl außerhalb einer virtuellen Umgebung python3 heißen.
import argparse
def nonnegative(text):
try:
value = int(text)
except ValueError as error:
raise argparse.ArgumentTypeError("expected an integer") from error
if value < 0:
raise argparse.ArgumentTypeError("expected a nonnegative amount")
return value
def main():
parser = argparse.ArgumentParser(description="Sum expense amounts")
parser.add_argument("amounts", type=nonnegative, nargs="+")
parser.add_argument("--currency", choices=["KRW", "USD"], default="KRW", help="Output unit label; no currency conversion")
args = parser.parse_args()
print(f"{sum(args.amounts):,} {args.currency}")
if __name__ == "__main__":
main()
Erwartete Ausgabe:
14,000 KRW
Die Funktion nonnegative unterscheidet eine nicht lesbare Ganzzahl von einem negativen Betrag. Sie übersetzt einen Umwandlungsfehler in argparse.ArgumentTypeError, sodass der Parser ihn mit einer passenden Gebrauchsanweisung ausgeben kann. Im Erfolgsfall enthält args.amounts bereits Zahlen; erst danach wird summiert und formatiert.
main() wird nur beim direkten Programmstart aufgerufen. Ein Import kann deshalb die Umwandlungsfunktion bereitstellen, ohne sofort Kommandozeilenargumente zu lesen. Die Summe wird im Beispiel innerhalb von main ausgegeben. Bei einer größeren Anwendung können Sie die Berechnung zusätzlich in eine Funktion mit Rückgabewert auslagern.
Die Darstellung 14,000 verwendet ausdrücklich ein Komma zur Tausendertrennung. --currency USD ändert nur das angehängte Label. Aus 14000 wird dann 14,000 USD; es wird kein Won-Betrag in US-Dollar umgerechnet. Geben Sie daher Zahlen ein, die bereits in der gewählten Einheit vorliegen.
Hilfe, Eingabefehler und Prozessstatus vergleichen
Führen Sie diese beiden Aufrufe nacheinander aus:
python sum_cli.py --help
python sum_cli.py 0 500 --currency KRW
Der Hilfeaufruf funktioniert ohne Beträge und zeigt Verwendung, Positionsargumente, Einheitsoption und deren Hilfetext. Der zweite Aufruf akzeptiert null und gibt 500 KRW aus. Programmpfad, Zeilenumbrüche und weitere Details der Hilfe können je nach Python-Version und Umgebung anders aussehen. Prüfen Sie die Bedeutung und den Status, statt überall eine identische Bildschirmdarstellung vorauszusetzen.
| Eingabe nach dem Dateinamen | Erwartung | Status |
|---|---|---|
0 |
0 KRW |
0 |
--help |
Hilfe ohne Berechnung | 0 |
| Keine Argumente | Mindestens ein Betrag fehlt | 2 |
-1 |
Negativer Betrag abgelehnt | 2 |
abc |
Keine lesbare Ganzzahl | 2 |
500 --currency EUR |
Nicht erlaubte Einheit | 2 |
Die Fehler werden mit Benutzungshinweisen ausgegeben, ohne danach eine Erfolgssumme zu drucken. Prüfen Sie unmittelbar nach einem Aufruf in PowerShell $LASTEXITCODE oder in einer üblichen macOS-/Ubuntu-Shell echo $?. Ein späterer weiterer Programmaufruf kann diesen Status bereits verändern. Die normalen Argumentfehler des Beispiels liefern Status zwei, erfolgreicher Lauf und Hilfe Status null.
Die Referenz zu argparse beschreibt Konverter, Auswahlwerte und Unterbefehle. Falls Sie keine Dezimalbeträge erlauben, bleibt 1.5 hier ungültig. Umgekehrt akzeptiert int auch Schreibweisen wie +5 oder führende Nullen. Wenn ausschließlich ASCII-Ziffern erlaubt sein sollen, müssen Sie eine entsprechend engere Textregel ergänzen.
Die Schnittstelle erweitern und den Vertrag prüfen
Für mehrere Aufgaben können Unterparser Befehle wie init, add und list trennen. Jeder Befehl sollte eindeutig festlegen, welche Eingaben er benötigt, welche Werte er verändert und welche Fehler er meldet. Übergibt die Auswertung nur die benötigten Werte an eine Berechnungsfunktion, lässt sich diese auch aus Tests oder einer anderen Oberfläche verwenden, ohne einen argparse.Namespace nachzubauen.
- Prüfen Sie den ursprünglichen Summenaufruf und danach nur den Betrag null. Beide müssen mit Status null enden.
- Testen Sie fehlende Argumente, einen negativen Wert, einen Textbetrag und eine nicht erlaubte Einheit jeweils in einem eigenen Aufruf. Es darf keine scheinbar erfolgreiche Summe erscheinen.
- Vergleichen Sie
14000 --currency KRWmit14000 --currency USD. Nur das Label darf wechseln; eine Währungsumrechnung ist ausdrücklich nicht Bestandteil dieses Programms. - Lesen Sie die Hilfe und stellen Sie anschließend einen gültigen Aufruf wieder her. Wenn Sie neue Optionen ergänzen, prüfen Sie deren Hilfetext und Fehlerstatus ebenfalls.
Eine passende Grundlage für die Trennung von Berechnung und Ausgabe bietet der Kurs zu Funktionen und Rückgabewerten. Der Parser soll die Eingabeschnittstelle klar machen; er ersetzt nicht die inhaltliche Festlegung, welche Beträge und Einheiten Ihre Anwendung tatsächlich verarbeitet.




