Direkt zum Inhalt

Beherrsche das argparse Modul von Python: Bessere CLIs erstellen

Lerne, wie du mit dem argparse-Modul effektive Kommandozeilenschnittstellen in Python erstellen kannst. Dieser Leitfaden führt dich durch grundlegende und fortgeschrittene Funktionen, mit praktischen Beispielen und Tipps zur Verbesserung deiner Programmierkenntnisse.
Aktualisierte 14. Feb. 2025  · 12 Min. Lesezeit

Python ist eine leistungsstarke Programmiersprache, mit der Entwickler eine Vielzahl von Anwendungen erstellen können, von einfachen Skripten bis hin zu großen Softwaresystemen. Eine der häufigsten Programmieraufgaben ist die Erstellung von Kommandozeilenschnittstellen (CLIs), die es den Benutzern ermöglichen, über ein Terminal oder eine Kommandozeile mit Programmen zu interagieren. CLIs sind unverzichtbar für die Skripterstellung, Automatisierung und in Fällen, in denen eine grafische Benutzeroberfläche unpraktisch ist.

Der Umgang mit Befehlszeilenparametern ist ein wichtiger Teil der Entwicklung von CLIs. Mit diesen Argumenten können Benutzer das Verhalten eines Programms beeinflussen, indem sie Eingabeparameter angeben, während es läuft. Ohne die Möglichkeit, diese Faktoren zu bewerten, wären die Programme weniger vielseitig und schwieriger für bestimmte Aufgaben anzupassen.

Python bietet mehrere Module zum Parsen von Kommandozeilenargumenten, aber das Modul argparse zeichnet sich durch seine Einfachheit und Vollständigkeit aus. Das Modul argparse macht es einfach, funktionale Kommandozeilenschnittstellen zu entwickeln. Sie analysiert die Parameter automatisch, zeigt hilfreiche Anweisungen an und meldet Fehler, wenn die Benutzer falsche Informationen eingeben.

In diesem Lernprogramm sehen wir uns an, wie du das Python-Paket argparse verwenden kannst. Wir beginnen mit einem Überblick über die Kommandozeilenschnittstellen von Python und die Bedeutung des Parsens von Kommandozeileneingaben. Dann werden wir das argparse Modul und seine Vorteile besprechen.

Überblick über die Befehlszeilenschnittstellen in Python

Kommandozeilenschnittstellen sind Programme, die nur auf textbasierte Befehle reagieren. Die Benutzer geben Befehle in ein Terminal oder eine Befehlszeile ein, die in der Regel Argumente und Optionen enthalten, die das Verhalten des Programms ändern. CLIs sind nützlich, weil sie leicht automatisiert und mit anderen Technologien integriert werden können.

In Python wird ein CLI erstellt, indem ein Skript entwickelt wird, das Befehlszeileneingaben entgegennimmt. Diese Eingabe wird normalerweise als eine Liste von Argumenten präsentiert, auf die das Skript zugreifen und sie interpretieren kann. Für einfache Programme kann es ausreichen, diese Argumente manuell über die sys.argv-Liste zu verwalten. Wenn die Komplexität des Programms jedoch zunimmt, wird die manuelle Bearbeitung von Argumenten ineffizient und fehleranfällig.

Bedeutung des Parsens von Kommandozeilenargumenten

Das Parsen von Kommandozeilenargumenten ist aus vielen Gründen notwendig: 

  • Flexibilität: Mit Hilfe von Parametern kann ein Programm mehrere Aufgaben ausführen oder auf verschiedene Datensätze reagieren, ohne den Code zu ändern. Du kannst die zu verarbeitenden Dateien angeben, Einstellungen konfigurieren und Betriebsmodi auswählen.
  • Benutzerfreundlichkeit: Wenn die Argumente richtig geparst werden, kann das Programm nützliche Meldungen anzeigen, den Benutzer anweisen, wie er das Programm verwenden soll, und Fehler korrekt behandeln.
  • Instandhaltbarkeit: Wenn du ein spezielles Parsing-Modul wie argparse verwendest, wird dein Code übersichtlicher und ist leichter zu pflegen. Sie trennt die Logik, die zum Parsen der Argumente verwendet wird, von der Hauptoperation des Programms.

Einführung in das argparse-Modul und seine Vorteile

Das Modul argparse ist Teil der Standardbibliothek von Python. Daher kann es ohne die Installation zusätzlicher Pakete verwendet werden. Es bietet eine einfache und konsistente Schnittstelle zum Parsen von Kommandozeileneingaben. Einige der Vorteile der Nutzung von argparse sind:

  • Automatische Hilfegenerierung: Er generiert Hilfe- und Verwendungsmeldungen auf der Grundlage der Argumente des Codes.
  • Fehlerbehandlung: Es zeigt hilfreiche Fehlermeldungen an, wenn Benutzer ungültige Argumente eingeben.
  • Typenumwandlung: Sie kann Parameterstrings automatisch in den entsprechenden Datentyp umwandeln.
  • Es unterstützt sowohl notwendige Positionsargumente als auch optionale Argumente mit Einfachheit.
  • Standardwerte: Sie ermöglicht es dir, Standardwerte für Parameter anzugeben, die der Benutzer nicht angibt.

argparse ermöglicht es Entwicklern, sich auf die Hauptfunktionen ihres Programms zu konzentrieren, während sie sich auf eine solide Grundlage für die Verwaltung von Kommandozeileneingaben verlassen können.

Einrichten von argparse und grundlegende Verwendung

Nachdem wir nun die Bedeutung des Parsens von Kommandozeilenargumenten und die Vorteile der Verwendung von argparse kennengelernt haben, wollen wir uns nun ansehen, wie man es einrichtet und in einem Python-Skript verwendet.

Installieren und Importieren von argparse

Du musst nichts extra installieren, denn argparse ist Teil der Python-Standardbibliothek. Du kannst sie direkt am Anfang deines Skripts importieren.

import argparse

Mit dieser Zeile wird das Modul argparse in dein Skript geladen, damit du seine Funktionen zum Parsen von Kommandozeilenargumenten nutzen kannst.

Einen einfachen Argument-Parser erstellen

Der erste Schritt zur Nutzung von argparse ist die Erstellung eines Parser-Objekts. Dieses Objekt speichert Informationen über die Argumente, die dein Programm akzeptiert, und parst die Befehlszeileneingabe.

parser = argparse.ArgumentParser(description='Process some integers.')

In diesem Beispiel erstellen wir ein ArgumentParser() Objekt und beschreiben das Programm. Wenn der Nutzer die Hilfeoption (-h oder --help) auswählt, wird diese Beschreibung angezeigt.

Hinzufügen von Positions- und optionalen Argumenten

Jetzt, wo wir den Parser entwickelt haben, können wir die Argumente angeben, die unser Programm akzeptieren wird.

Hinzufügen von Positionsargumenten

Positionsbezogene Argumente sind wichtig und müssen in einer genauen Reihenfolge präsentiert werden. Nehmen wir zum Beispiel ein Skript, das zwei Zahlen addiert. Wir können zwei Positionsargumente für die Zahlen definieren:

parser.add_argument('num1', type=int, help='The first number to add.')
parser.add_argument('num2', type=int, help='The second number to add.')

In diesem Code beziehen sich num1 und num2 auf die Positionsparameter.

type=int gibt an, dass die Parameter in Ganzzahlen umgewandelt werden sollen. Das Argument help gibt eine Beschreibung an, die in der Hilfemeldung erscheinen wird.

Hinzufügen optionaler Argumente

Optionale Argumente sind nicht notwendig und bieten normalerweise zusätzliche Optionen oder ändern das Verhalten des Programms. Sie werden in der Regel mit einem oder zwei Bindestrichen vorangestellt. Wir fügen ein optionales Argument hinzu, um die ausführliche Ausgabe zu aktivieren:

parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.')

Hier:

  • Die kurze Option ist -v (zum Beispiel -v). --verbose ist eine lange Option.
  • action='store_true' gibt an, dass das Verbose-Attribut auf True gesetzt wird, wenn die Option ausgewählt ist; andernfalls wird es auf False gesetzt.
  • Das Argument help gibt eine Beschreibung für die Hilfemeldung an.

Parsing von Argumenten und Zugriff auf ihre Werte

Nachdem wir alle Argumente angegeben haben, müssen wir die Befehlszeileneingabe parsen. Verwende dazu die Methode .parse_args().

args = parser.parse_args()

Die geparsten Parameter werden jetzt als Attribute in der Variable args gespeichert. Wir können sie mit der Punktnotation aufrufen.

result = args.num1 + args.num2
print('The sum of {} and {} is {}'.format(args.num1, args.num2, result))
if args.verbose:
    print('Verbose mode is enabled.')

Hier ist ein komplettes Skript, das zwei Zahlen addiert und einen optionalen ausführlichen Modus enthält:

import argparse
parser = argparse.ArgumentParser(description='Add two integers.')
parser.add_argument('num1', type=int, help='The first number to add.')
parser.add_argument('num2', type=int, help='The second number to add.')
parser.add_argument('-v', '--verbose', action='store_true', help='Increase output verbosity.')
args = parser.parse_args()
result = args.num1 + args.num2
print('The sum of {} and {} is {}'.format(args.num1, args.num2, result))
if args.verbose:
    print('Calculation completed successfully.')

Du kannst dieses Skript über die Befehlszeile ausführen und die erforderlichen Positionsargumente angeben:

python add_numbers.py 3 5
The sum of 3 and 5 is 8

Wenn du die Option -v oder --verbose angibst, gibt das Skript eine zusätzliche ausführliche Meldung aus:

python add_numbers.py 3 5 --verbose
The sum of 3 and 5 is 8
Calculation completed successfully.

Wenn der Benutzer das Skript mit der Option -h oder --help ausführt, wird auf argparse eine automatisch generierte Hilfemeldung angezeigt:

python add_numbers.py -h
usage: add_numbers.py [-h] [-v] num1 num2
Add two integers.
positional arguments:
  num1           The first number to add.
  num2           The second number to add.
optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  Increase output verbosity.

Diese Funktion macht dein Programm benutzerfreundlicher, indem sie klare Anweisungen für die Benutzung liefert.

Erweiterte Argumentbehandlung

Bei der Entwicklung von Kommandozeilenprogrammen in Python kann es vorkommen, dass du auf Szenarien triffst, die ein komplexeres Argument-Parsing erfordern. Das Python-Modul argparse enthält mehrere Funktionen, um diese komplexen Anforderungen zu erfüllen, sodass du flexible und benutzerfreundliche Schnittstellen entwickeln kannst.

Verwendung von nargs für mehrere Argumente

Es gibt Situationen, in denen deine Anwendung mehrere Werte für dasselbe Argument akzeptieren muss. Angenommen, du möchtest ein Skript erstellen, das mehrere Dateien auf einmal verarbeitet. Mit dem Parameter nargs in argparse kannst du angeben, wie viele Kommandozeilenargumente gelesen werden sollen.

Hier erfährst du, wie du nargs verwenden kannst, um mehrere Dateinamen zu akzeptieren:

import argparse
parser = argparse.ArgumentParser(description='Process multiple files.')
parser.add_argument('filenames', nargs='+', help='List of files to process.')
args = parser.parse_args()
for filename in args.filenames:
    print(f'Processing file: {filename}')
    # Add your file processing code here

In diesem Fall weist nargs='+' den Parser an, ein oder mehrere Argumente in Dateinamen zu erwarten. Der Benutzer kann so viele Dateinamen wie nötig angeben, die dann in einer Liste namens args.filenames gespeichert werden.

Wenn du eine bestimmte Anzahl von Argumenten akzeptieren willst, setze nargs auf diese Zahl. nargs=2 benötigt zum Beispiel genau zwei Parameter.

Auswahlmöglichkeiten zur Begrenzung der Argumente implementieren

Manchmal möchtest du ein Argument auf einen bestimmten Bereich gültiger Werte beschränken. So wird sichergestellt, dass der/die Nutzer/in gültige Eingaben macht und Fehler oder unerwartete Aktionen vermieden werden. Mit dem Parameter options kannst du die zulässigen Werte für ein Argument angeben.

Betrachte ein Skript, das je nach dem vom Benutzer gewählten Modus mehrere Aktivitäten ausführt.

import argparse
parser = argparse.ArgumentParser(description='Perform actions in different modes.')
parser.add_argument('--mode', choices=['backup', 'restore', 'delete'], required=True, help='Mode of operation.')
args = parser.parse_args()
if args.mode == 'backup':
    print('Backing up data...')
    # Backup code here
elif args.mode == 'restore':
    print('Restoring data...')
    # Restore code here
elif args.mode == 'delete':
    print('Deleting data...')
    # Delete code here

In diesem Skript muss das Argument --mode eine der Optionen sein. Wenn der Benutzer einen Wert eingibt, der nicht in der Liste steht, gibt argparse eine Fehlermeldung aus.

Umgang mit booleschen Flags und Toggles

Boolesche Flags sind Auswahlmöglichkeiten, die bestimmte Funktionen in deiner Anwendung aktivieren oder deaktivieren. Sie werden in der Regel ohne einen Wert definiert, indem das Flag einfach in den Befehl eingefügt wird. Du kannst diese Flags in argparse mit dem Parameter action behandeln.

Wir wollen zum Beispiel einen Debug-Modus in ein Skript einbauen:

import argparse
parser = argparse.ArgumentParser(description='A script with debug mode.')
parser.add_argument('--debug', action='store_true', help='Enable debug output.')
args = parser.parse_args()
if args.debug:
    print('Debug mode is enabled.')
    # Additional debug information here
else:
    print('Debug mode is disabled.')

Wenn du action='store_true' verwendest, setzt das --debug Flag args.debug auf True, wenn es vorhanden ist, und ansonsten auf False.

Standardwerte und erforderliche Argumente festlegen

Optionale Argumente enthalten häufig sinnvolle Standardwerte. Das bedeutet, dass die Anwendung die Standardeinstellung verwendet, wenn der Benutzer das Argument nicht angibt. Mit dem Argument default kannst du einen Standardwert angeben.

Hier ist ein Beispiel:

import argparse
parser = argparse.ArgumentParser(description='Adjust program settings.')
parser.add_argument('--timeout', type=int, default=30, help='Timeout in seconds.')
args = parser.parse_args()
print(f'Timeout is set to {args.timeout} seconds.')

Wenn der Benutzer in diesem Szenario nicht --timeout angibt, ist der Standardwert 30 Sekunden.

Um ein optionales Argument obligatorisch zu machen, set required=True.

import argparse
parser = argparse.ArgumentParser(description='Send a message.')
parser.add_argument('--recipient', required=True, help='Recipient of the message.')
args = parser.parse_args()
print(f'Sending message to {args.recipient}.')

Das Skript benötigt nun das Argument --recipient.

Hilfe und Fehlermeldungen anpassen

Klare und hilfreiche Meldungen für die Benutzer sind ein wesentlicher Bestandteil der Entwicklung eines effektiven Kommandozeilenprogramms. Das Modul argparse von Python erstellt automatisch Hilfemeldungen, aber du kannst diese Meldungen an deine Bedürfnisse anpassen.

Automatische Hilfemeldungen generieren

Standardmäßig erzeugt argparse eine Hilfemeldung, die mit den Optionen -h oder --help aufgerufen werden kann. Diese Nachricht enthält die Verwendung des Programms, eine Beschreibung und Informationen zu jedem Argument.

Zum Beispiel:

import argparse
parser = argparse.ArgumentParser(description='Calculate factorial of a number.')
parser.add_argument('number', type=int, help='The number to calculate the factorial for.')
args = parser.parse_args()

Wenn ein Benutzer das Skript mit -h ausführt, wird er sehen:

usage: script.py [-h] number
Calculate factorial of a number.
positional arguments:
  number      The number to calculate the factorial for.
optional arguments:
  -h, --help  show this help message and exit

Diese automatische Hilfemeldung gibt dir nützliche Informationen, ohne dass du etwas dafür tun musst.

Anpassen von Hilfebeschreibungen und Nutzungsmeldungen

Die Standard-Hilfemeldungen sind zwar nützlich, aber du möchtest sie vielleicht abändern, um zusätzliche Informationen zu liefern oder um sie an eine bestimmte Struktur anzupassen. Du kannst die Beschreibung, den Epilog und den Verwendungstext auf ArgumentParser ändern.

Zum Beispiel, um einen Epilog einzufügen und die Nutzungsnachricht zu personalisieren:

import argparse
parser = argparse.ArgumentParser(
    description='Convert temperatures between Celsius and Fahrenheit.',
    epilog='Enjoy using the temperature converter!',
    usage='%(prog)s [options] temperature')
parser.add_argument('temperature', type=float, help='Temperature value to convert.')
parser.add_argument('--to-fahrenheit', action='store_true', help='Convert Celsius to Fahrenheit.')
parser.add_argument('--to-celsius', action='store_true', help='Convert Fahrenheit to Celsius.')
args = parser.parse_args()

Wenn der Benutzer nun die Hilfemeldung überprüft, enthält sie die angepasste Beschreibung, die Verwendung und den Epilog:

python file.py --help

usage: p.py [options] temperature

Convert temperatures between Celsius and Fahrenheit.

positional arguments:
  temperature      Temperature value to convert.

options:
  -h, --help       show this help message and exit
  --to-fahrenheit  Convert Celsius to Fahrenheit.
  --to-celsius     Convert Fahrenheit to Celsius.

Umgang mit Fehlern und Nutzerfeedback

Wenn ein Benutzer ungültige Argumente eingibt, zeigt argparse eine Fehlermeldung an und beendet das Programm. Du kannst dieses Verhalten ändern, um eine nützlichere Rückmeldung zu geben oder um Fehler anders zu behandeln.

Eine Möglichkeit besteht darin, die Fehlermethode in einer Unterklasse von ArgumentParser:

import argparse
import sys
class CustomArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        print(f'Error: {message}')
        self.print_help()
        sys.exit(2)
parser = CustomArgumentParser(description='Divide two numbers.')
parser.add_argument('numerator', type=float, help='The numerator.')
parser.add_argument('denominator', type=float, help='The denominator.')
args = parser.parse_args()
if args.denominator == 0:
    parser.error('Denominator cannot be zero.')
result = args.numerator / args.denominator
print(f'Result: {result}')

Wenn der/die Benutzer/in versucht, in diesem Skript durch Null zu dividieren, zeigt die Anwendung eine Fehlerwarnung und einen Hilfetext an, der den/die Benutzer/in auffordert, gültige Daten anzugeben.

Python file.py 6 0
Error: Denominator cannot be zero.
usage: file.py [-h] numerator denominator
Divide two numbers.
positional arguments:
  numerator    The numerator.
  denominator  The denominator.
options:
  -h, --help   show this help message and exit

Du kannst auch eine eigene Fehlerbehandlung in dein Skript einbauen. Zum Beispiel, um ungültige Dateipfade zu verwalten:

import argparse
import os
parser = argparse.ArgumentParser(description='Read a file and display its contents.')
parser.add_argument('filepath', help='Path to the file.')
args = parser.parse_args()
if not os.path.exists(args.filepath):
    parser.error(f"The file {args.filepath} does not exist.")
with open(args.filepath, 'r') as file:
    contents = file.read()
    print(contents)

Wenn du das Skript mit einem ungültigen Pfad ausführst, wird die folgende Fehlermeldung angezeigt:

python app..py file
usage: p.py [-h] filepath
app.py: error: The file file does not exist.

Beispiele aus der Praxis und Anwendungsfälle

Wenn du verstehst, wie man das Modul argparse in der Praxis einsetzt, wird seine Funktionsweise klarer. Schauen wir uns einige Beispiele an, wie argparse in der Praxis eingesetzt werden kann.

Einen Kommandozeilen-Rechner bauen

Angenommen, du musst einen einfachen Taschenrechner entwickeln, der grundlegende Rechenoperationen über die Kommandozeile ausführen kann. Dieser Taschenrechner sollte zwei Zahlen und einen Operator akzeptieren, um die gewünschte Berechnung auszuführen.

Hier erfährst du, wie du an diese Aufgabe herangehst:

import argparse
parser = argparse.ArgumentParser(description='Simple command-line calculator.')
parser.add_argument('num1', type=float, help='First number.')
parser.add_argument('operator', choices=['+', '-', '*', '/'], help='Operation to perform.')
parser.add_argument('num2', type=float, help='Second number.')
args = parser.parse_args()
if args.operator == '+':
    result = args.num1 + args.num2
elif args.operator == '-':
    result = args.num1 - args.num2
elif args.operator == '*':
    result = args.num1 * args.num2
elif args.operator == '/':
    if args.num2 == 0:
        print('Error: Division by zero is not allowed.')
        exit(1)
    result = args.num1 / args.num2
print(f'The result is: {result}')

In diesem Skript wird das Modul argparse verwendet, um drei Positionsargumente zu definieren: zwei Zahlen und einen Operator. Das Argument choices schränkt den Operator auf gültige arithmetische Symbole ein. Wenn der Nutzer das Skript ausführt, kann er diese Berechnungen durchführen:

python calculator.py 10 + 5
The result is: 15.0

Dieser einfache Taschenrechner zeigt, wie Kommandozeilenoptionen die Flexibilität und Interaktivität eines Programms verbessern können.

Ein Skript zur Dateiverarbeitung mit mehreren Optionen erstellen

Angenommen, du benötigst ein Skript, das Textdateien verarbeitet und dir die Möglichkeit gibt, eine Ausgabedatei zu bestimmen, einen Verarbeitungsmodus auszuwählen und die ausführliche Ausgabe zu aktivieren.

Hier ist ein Beispiel, wie du es einrichten kannst:

import argparse
parser = argparse.ArgumentParser(description='Process text files.')
parser.add_argument('input_file', help='Path to the input file.')
parser.add_argument('-o', '--output', help='Path to the output file.')
parser.add_argument('-m', '--mode', choices=['uppercase', 'lowercase'], default='uppercase', help='Processing mode.')
parser.add_argument('-v', '--verbose', action='store_true', help='Enable verbose output.')
args = parser.parse_args()
# Read the input file
with open(args.input_file, 'r') as file:
    content = file.read()
if args.verbose:
    print(f'Reading from {args.input_file}')
# Process the content
if args.mode == 'uppercase':
    processed_content = content.upper()
else:
    processed_content = content.lower()
if args.verbose:
    print('Processing content')
# Write to the output file or print to console
if args.output:
    with open(args.output, 'w') as file:
        file.write(processed_content)
    if args.verbose:
        print(f'Writing output to {args.output}')
else:
    print(processed_content)

Dieses Skript akzeptiert eine Eingabedatei und hat Optionen für die Ausgabedatei, den Verarbeitungsmodus und die ausführliche Ausgabe. Die Nutzer können das Verhalten des Skripts ändern, ohne den Code zu verändern.

python text_processor.py input.txt -o output.txt --mode lowercase -v
Reading from input.txt
Processing content
Writing output to output.txt

Entwickeln eines CLI-Tools mit Unterbefehlen

Bei komplizierteren Anwendungen können Unterbefehle erforderlich sein, ähnlich wie bei git mit Befehlen wie git commit und git push. Das Modul argparse bietet zu diesem Zweck Subparser.

Hier erfährst du, wie du ein CLI-Tool mit Unterbefehlen erstellst:

import argparse
parser = argparse.ArgumentParser(description='Manage tasks.')
subparsers = parser.add_subparsers(dest='command', required=True)
# Subcommand 'add'
parser_add = subparsers.add_parser('add', help='Add a new task.')
parser_add.add_argument('name', help='Name of the task.')
parser_add.add_argument('-p', '--priority', type=int, choices=range(1, 6), default=3, help='Priority of the task.')
# Subcommand 'list'
parser_list = subparsers.add_parser('list', help='List all tasks.')
parser_list.add_argument('-a', '--all', action='store_true', help='List all tasks, including completed ones.')
# Subcommand 'complete'
parser_complete = subparsers.add_parser('complete', help='Mark a task as completed.')
parser_complete.add_argument('task_id', type=int, help='ID of the task to complete.')
args = parser.parse_args()
if args.command == 'add':
    print(f"Adding task '{args.name}' with priority {args.priority}")
    # Code to add the task
elif args.command == 'list':
    print('Listing tasks')
    if args.all:
        print('Including completed tasks')
    # Code to list tasks
elif args.command == 'complete':
    print(f'Marking task {args.task_id} as completed')
    # Code to complete the task

In diesem Beispiel hat das Skript drei Unterbefehle: add, list, und complete. Jeder Unterbefehl hat seine Argumente. Wenn die Nutzer das Skript ausführen, geben sie den Unterbefehl und alle anderen Parameter ein.

Zum Beispiel:

python task_manager.py add "Write report" -p 2
Adding task 'Write report' with priority 2

Aufgaben auflisten

python task_manager.py list
Listing tasks

Aufgaben als erledigt markieren:

python task_manager.py complete 3
Marking task 3 as completed

subparsers ermöglichen es dir, komplexe Kommandozeilentools zu erstellen, die gut organisiert und einfach zu erweitern sind. So kannst du Anwendungen erstellen, die mehrere Dinge in einer einzigen Oberfläche erledigen können. 

Python argparse Best Practices und Tipps

Zum Entwickeln von Kommandozeilenprogrammen gehört mehr, als nur funktionierenden Code zu schreiben. Dazu gehört auch, dass der Code sauber, wartbar und benutzerfreundlich ist. 

Hier sind einige bewährte Methoden für die Arbeit mit dem Modul argparse.

Organisation des Codes für Lesbarkeit und Wartung

Wenn deine Skripte komplexer werden, ist es wichtig, deinen Code zu organisieren, um ihn besser zu verstehen und zu warten. Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Funktionen und Klassen, um bestimmte Abschnitte deines Codes zu organisieren. 

Wenn du dein Programm in kleinere, wiederverwendbare Teile zerlegst, ist es leichter zu verwalten und doppelter Code wird vermieden.

In einem Skript zur Aufgabenverwaltung könntest du zum Beispiel verschiedene Funktionen für das Hinzufügen von Aufgaben, das Auflisten von Aufgaben und das Erledigen von Aufgaben definieren. Diese Aufteilung ermöglicht es dir, dich jeweils auf einen Aspekt der Logik zu konzentrieren, wodurch dein Code übersichtlicher wird.

Eine weitere effektive Technik ist die Trennung der Logik für das Parsen von Argumenten vom Rest deines Codes. Wenn du alle Argumentdefinitionen und das Parsing am Anfang deines Skripts oder in einer eigenen Funktion unterbringst, ist es für andere leichter zu verstehen, wie dein Programm die Eingaben verarbeitet.

Die Verwendung geeigneter Variablennamen verbessert auch die Lesbarkeit. Wähle Variablennamen, die ihren Zweck widerspiegeln, damit jeder, der deinen Code sieht, versteht, was vor sich geht. Wenn du Kommentare und docstrings einfügst, um zu erklären, was deine Funktionen tun und welche Details wichtig sind, kann das zum besseren Verständnis beitragen.

Testen und Debuggen von Kommandozeilenanwendungen

Das Testen deiner Anwendungen ist wichtig, um sicherzustellen, dass sie richtig funktionieren und um Fehler frühzeitig zu erkennen. Das Schreiben von Unit-Tests mit Python-Testframeworks wie unittest oder pytest ist eine hervorragende Methode, um deinen Code zu testen. Diese Tests ermöglichen es dir, verschiedene Eingaben zu simulieren und sicherzustellen, dass deine Funktionen richtig funktionieren.

Du kannst zum Beispiel mehrere Szenarien testen, indem du die Befehlszeileneingaben nachahmst, anstatt das Skript über die Befehlszeile auszuführen. Mit dieser Strategie kannst du sicherstellen, dass dein Argument-Parsing wie erwartet funktioniert und dass deine Anwendung verschiedene Szenarien korrekt behandelt.

Ein guter Umgang mit Ausnahmen ist ebenfalls wichtig. Mit den Blöcken von try-except kannst du Fehler abfangen und nützliche Meldungen an die Benutzer/innen weitergeben. Das macht deine Anwendung stabiler und benutzerfreundlicher.

Erwäge auch, ein Debug-Flag in dein Skript einzubauen. Mit diesem Flag kannst du zusätzliche Ausgaben aktivieren, die es dir ermöglichen, die Ausführung des Programms zu verfolgen, wenn etwas schief läuft. Mit dieser Option ist es einfacher, Probleme während der Entwicklung und Wartung zu diagnostizieren.

Vergleich von argparse mit anderen Bibliotheken zum Parsen von Argumenten

Obwohl argparse ein wertvolles Dienstprogramm in der Python-Standardbibliothek ist, gibt es weitere Bibliotheken, die alternative Methoden zum Parsen von Kommandozeilenargumenten anbieten. Wenn du diese Optionen verstehst, kannst du das richtige Werkzeug für dein Projekt auswählen.

Eine solche Bibliothek ist Click. Click ist ein Drittanbieter-Paket zur Erstellung von Kommandozeilenschnittstellen mit Dekoratoren. Sie hat eine intuitivere Syntax und ist ideal für anspruchsvolle Anwendungen. Du kannst zum Beispiel Python-Dekoratoren verwenden, um Befehle und Optionen zu erstellen und so deinen Code kompakter und verständlicher zu machen.

Docopt ist eine weitere Option, mit der du deine Kommandozeilenschnittstelle über den Docstring des Programms definieren kannst. Docopt analysiert automatisch die Hilfemeldung und konstruiert den Argumentparser, wenn die Verwendungsanweisungen im Docstring enthalten sind. Dieser Ansatz ist elegant und eignet sich für einfache Skripte, die eine besser lesbare Spezifikation erfordern.

Wenn du dich für eine Bibliothek entscheidest, solltest du dir Gedanken über die Anforderungen deines Projekts machen. Wenn du auf externe Abhängigkeiten verzichten möchtest und ein Tool suchst, das mit den meisten Situationen zurechtkommt, ist argparse eine hervorragende Lösung. Wenn du eine intuitivere Syntax möchtest und an einer komplexen Anwendung arbeitest, könnte Click besser geeignet sein. Docopt ist eine gute Wahl für kleine Programme mit einfachen Oberflächen.

Fazit

In diesem Artikel haben wir uns angesehen, wie du mit dem Python argparse Modul Kommandozeilenprogramme in Python entwickeln kannst. Anhand von Beispielen aus der Praxis lernten wir, wie man realistische Skripte erstellt, die Benutzereingaben empfangen und relevante Aufgaben erfüllen.

Vom Entwurf eines einfachen Taschenrechners bis hin zur Entwicklung eines Aufgabenmanagement-Tools mit Unterbefehlen bietet das Modul argparse die nötige Vielseitigkeit, um eine Vielzahl von Situationen zu bewältigen. Du kannst Anwendungen entwickeln, die zuverlässig und einfach zu warten sind, indem du dich an Best Practices wie Codeorganisation, umfassende Tests und die Berücksichtigung alternativer Bibliotheken hältst.

Ganz gleich, ob du Aktivitäten automatisierst, Daten analysierst oder komplizierte Tools erstellst, das Verständnis der Analyse von Kommandozeilenargumenten verbessert deine Fähigkeit, effektive Python-Programme zu entwickeln. Verbessere deine Python-Kenntnisse noch heute mit unserem Lernpfad "Python Grundlagen".

Python argparse FAQs

Wie kann ich ein optionales Argument in argparse erforderlich machen?

Optionale Argumente in argparse sind normalerweise nicht notwendig, da sie per Definition optional sind. Es kann jedoch vorkommen, dass du ein Argument, das mit -- beginnt, als obligatorisch einstufen möchtest. Um dies zu erreichen, setze den erforderlichen Parameter auf True, wenn du das Argument hinzufügst.

Hier erfährst du, wie du es schaffen kannst:

import argparse
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--input', required=True, help='Path to the input file.')
args = parser.parse_args()
print(f'Input file: {args.input}')

Wie gehe ich mit sich gegenseitig ausschließenden Argumenten mit argparse um?

Manchmal stößt du auf Argumente, die nicht zusammen verwendet werden sollten. Ein Skript kann zum Beispiel entweder --verboseoder --quiet verwenden, aber nicht beides auf einmal. Um dieses Szenario zu bewältigen, unterstützt argparse die Definition von sich gegenseitig ausschließenden Gruppen.

Hier erfährst du, wie du es einrichten kannst:

import argparse
parser = argparse.ArgumentParser(description='Process some data.')
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true', help='Enable verbose output.')
group.add_argument('--quiet', action='store_true', help='Enable quiet mode.')
args = parser.parse_args()
if args.verbose:
    print('Verbose mode is on.')
elif args.quiet:
    print('Quiet mode is on.')
else:
    print('Default mode is on.')

Mit diesem Skript kannst du entweder den ausführlichen oder den ruhigen Modus aktivieren , aber nicht beides. Wenn sie versuchen, beide Optionen gleichzeitig zu nutzen, wird argparse einen Fehler ausgeben.

Wie kann ich argparse verwenden, um Argumente aus einer Datei statt aus der Kommandozeile zu lesen?

Obwohl argparse für das Parsen von Kommandozeilenargumenten gedacht ist, möchtest du sie vielleicht auch aus einer Datei lesen. Du kannst dies tun, indem du die Argumente aus der Datei liest und sie über den Parameterargs an die Methode parse_args() übergibst.

Hier ist ein Beispiel.

import argparse
parser = argparse.ArgumentParser(description='Process some data.')
parser.add_argument('--input', help='Path to the input file.')
parser.add_argument('--output', help='Path to the output file.')
# Read arguments from a file
with open('args.txt', 'r') as file:
    file_args = file.read().split()
args = parser.parse_args(file_args)
print(f'Input file: {args.input}')
print(f'Output file: {args.output}')

In diesem Fall wird die args.txt Datei enthalten:

--input data/input.txt --output data/output.txt

Das Skript liest die Parameter aus der Datei, wandelt sie in eine Liste um und gibt sie dann an parse_args() weiter. So kannst du deine Argumente in einer Datei verwalten, anstatt sie jedes Mal neu einzugeben.

Wie kann ich die Hilfemeldung in argparse so anpassen, dass sie Standardwerte anzeigt?

Standardmäßig zeigtargparse die Standardwerte der Parameter nicht in der Hilfemeldung an. Wenn du Standardwerte in den Hilfetext aufnehmen willst, ändere entweder den Hilfeparameter oder verwende die ArgumentDefaultsHelpFormatter.

Hier erfährst du, wie du der Hilfemeldung Standardwerte hinzufügst:

import argparse
parser = argparse.ArgumentParser(
    description='Process some data.',
    formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('--timeout', type=int, default=60, help='Timeout in seconds.')
args = parser.parse_args()
print(f'Timeout is set to {args.timeout} seconds.')

Mit dem ArgumentDefaultsHelpFormatter wird in der Hilfemeldung der Standardwert für das Argument --timeout angezeigt:

usage: script.py [-h] [--timeout TIMEOUT]
Process some data.
optional arguments:
  -h, --help         show this help message and exit
  --timeout TIMEOUT  Timeout in seconds. (default: 60)

So erhältst du mehr Informationen über die Standardeinstellungen deines Programms.

Welche Best Practices gibt es für das Testen von Kommandozeilenanwendungen, die argparse verwenden?

Das Testen von Kommandozeilenanwendungen kann schwierig sein, aber es gibt Methoden, die es einfacher machen. Eine nützliche Möglichkeit ist die Replikation von Kommandozeilenargumenten mit dem unittest-Modul.

Hier ist ein Beispiel dafür, wie man ein Skript mit argparse:

import unittest
import argparse
import sys
def create_parser():
    parser = argparse.ArgumentParser(description='Process some data.')
    parser.add_argument('--number', type=int, help='A number.')
    return parser
def main(args):
    parser = create_parser()
    parsed_args = parser.parse_args(args)
    if parsed_args.number is None:
        parser.error('No number provided.')
    result = parsed_args.number * 2
    return result
class TestMain(unittest.TestCase):
    def test_main_with_number(self):
        test_args = ['--number', '5']
        result = main(test_args)
        self.assertEqual(result, 10)
    def test_main_without_number(self):
        test_args = []
        with self.assertRaises(SystemExit):
            main(test_args)
if __name__ == '__main__':
    unittest.main()

Im Testskript:

  • Die .create_parser() Methode initialisiert den Argument-Parser.
  • Die main() Funktion verarbeitet die Argumente und führt die Hauptlogik aus.
  • Die TestMain Klasse bietet Testmethoden zur Simulation verschiedener Befehlszeileneingaben.
  • Die Tests stellen sicher, dass das Programm wie erwartet auf verschiedene Eingaben reagiert.

Strukturiere deinen Code so, dass die Verarbeitung von Argumenten und die primäre Logik getrennt sind, damit es einfacher ist, verschiedene Bereiche deines Programms zu testen.

Themen
Verwandt

Der Blog

Lehrer/innen und Schüler/innen erhalten das Premium DataCamp kostenlos für ihre gesamte akademische Laufbahn

Keine Hacks, keine Tricks. Schüler/innen und Lehrer/innen, lest weiter, um zu erfahren, wie ihr die Datenerziehung, die euch zusteht, kostenlos bekommen könnt.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

4 Min.

Der Blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates hat im zweiten Quartal 2023 über 20.000 Stipendien an unsere gemeinnützigen Partner vergeben. Erfahre, wie fleißige benachteiligte Lernende diese Chancen in lebensverändernde berufliche Erfolge verwandelt haben.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Der Blog

2022-2023 DataCamp Classrooms Jahresbericht

Zu Beginn des neuen Schuljahres ist DataCamp Classrooms motivierter denn je, das Lernen mit Daten zu demokratisieren. In den letzten 12 Monaten sind über 7.650 neue Klassenzimmer hinzugekommen.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 Min.

Der Blog

Top 30 Generative KI Interview Fragen und Antworten für 2024

Dieser Blog bietet eine umfassende Sammlung von Fragen und Antworten zu generativen KI-Interviews, die von grundlegenden Konzepten bis hin zu fortgeschrittenen Themen reichen.
Hesam Sheikh Hassani's photo

Hesam Sheikh Hassani

15 Min.

Der Blog

Die 20 besten Snowflake-Interview-Fragen für alle Niveaus

Bist du gerade auf der Suche nach einem Job, der Snowflake nutzt? Bereite dich mit diesen 20 besten Snowflake-Interview-Fragen vor, damit du den Job bekommst!
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

20 Min.

Mehr anzeigenMehr anzeigen