Verwenden von argparse zum Analysieren von Parametern von Python-Skripten
Objektiv
Erfahren Sie, wie Sie das argparse-Modul verwenden, um Parameter von Python-Skripten einfach zu analysieren
Anforderungen
- Grundkenntnisse in Python und objektorientierten Konzepten
Schwierigkeit
LEICHT
Konventionen
- # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder
direkt als Root-Benutzer oder mit dem Befehlsudo - $ – erfordert, dass bestimmte Linux-Befehle als normaler, nicht privilegierter Benutzer ausgeführt werden
Einleitung
In einem früheren Artikel haben wir gesehen, wie man Befehlszeilenargumente mit getopts im Kontext von Bash-Skripten parst (den Artikel finden Sie hier). Jetzt werden wir sehen, wie Sie die gleiche Aufgabe auf eine leistungsfähigere Weise erledigen können, wenn Sie ein Python-Skript schreiben.
Initialisieren des Parsers
Um unser Ziel zu erreichen, werden wir ein Python-Modul namens argparse verwenden. Es ermöglicht uns, unsere Befehlszeilenparameter zu spezifizieren und automatisch die Skript-Hilfemeldung basierend auf ihnen zu generieren. Fangen wir also an, wir nennen unser Skript "printerscript.py":
#!/usr/bin/env python
import argparse
if __name__ == '__main__':
# Initialize the parser
parser = argparse.ArgumentParser(
description="simple script to demonstrate argparse usage"
)Das erste, was zu tun ist, ist natürlich, das argparse-Modul zu importieren. Danach fahren wir mit der Initialisierung des Parsers fort. Das Schlüsselwort description, das an den Parser-Konstruktor übergeben wird, ist optional, ermöglicht es uns jedoch, eine kurze Beschreibung des Skripts hinzuzufügen, wenn die Hilfemeldung angezeigt wird.
Es gibt andere Schlüsselwörter, die wir verwenden können, um das Verhalten des Parsers weiter anzupassen: Zum Beispiel können wir mit dem Schlüsselwort epilog einen Text angeben, der nach der Haupthilfemeldung angezeigt wird, oder mit prog können wir den Namen des Programms angeben, das im selben Kontext angezeigt werden soll (standardmäßig wird sys.argv[0] verwendet).
Hinzufügen eines Positionsparameters
Jetzt ist es an der Zeit, dem Skript unseren ersten Positionsparameter hinzuzufügen. In diesem Fall fügen wir den Parameter "printme" hinzu, d.h. den String, der von unserem Testskript gedruckt wird. Wir erreichen dies, indem wir die Methode add_argument() des Parser-Objekts verwenden, das wir oben initialisiert haben:
parser.add_argument('printme', help="The string to be printed")Das erste Argument, das wir der Methode zur Verfügung gestellt haben, ist der Name des Parameters, und das zweite, optionale, ist help. Mit diesem Schlüsselwort können wir die Beschreibung für den Parameter angeben, der in der von argparse generierten Hilfemeldung angezeigt wird.
Es ist wichtig zu beachten, dass die Parameter standardmäßig als Zeichenfolgen betrachtet werden: Um einen anderen Datentyp anzugeben, müssen wir das Schlüsselwort type verwenden. Wenn wir zum Beispiel wollten, dass unser Argument in eine Ganzzahl konvertiert wird, hätten wir es auf diese Weise angegeben:
parser.add_argument('printme', type=int)Nachdem wir unseren Parameter hinzugefügt haben, müssen wir die Methode parse_args() des Parser-Objekts aufrufen. Diese Methode gibt eine Instanz von argparse zurück. Namespace-Klasse: Die analysierten Parameter werden als Attribute dieser Instanz gespeichert. Schließlich können wir eine Zeile hinzufügen, um die Variable zu drucken. An dieser Stelle sollte das Skript folgendermaßen aussehen:
#!/usr/bin/env python
import argparse
if __name__ == '__main__':
# Initialize the parser
parser = argparse.ArgumentParser(
description="simple script to demonstrate argparse usage"
)
# Add the positional parameter
parser.add_argument('printme', help="The string to be printed")
# Parse the arguments
arguments = parser.parse_args()
# Finally print the passed string
print(arguments.printme)Lassen Sie es uns ausführen:
./printerscript.py "hello world!"
hello world!
Die Zeichenfolge, die wir übergeben haben, wurde gedruckt und erwartet. Aber was wäre, wenn wir es nicht zur Verfügung stellen würden? Es wäre die Hilfemeldung eingeblendet worden, die die korrekte Verwendung des Skripts beschreibt:
./printerscript.py
usage: printerscript.py [-h] printme
printerscript.py: error: too few arguments
Hinzufügen eines optionalen Parameters
Optionale Parameter sind für die Verwendung des Skripts nicht zwingend erforderlich, werden jedoch verwendet, um sein Verhalten zu ändern. Argparse erkennt sie, wenn es erkennt, dass Bindestriche in der Beschreibung angegeben sind, also zum Beispiel:
parser.add_argument(
'-r', '--repeat',
help="number of times to print the string",
type=int,
default=1
)Dem Namen des Parameters wird ein Bindestrich vorangestellt (wir können sowohl die kurze als auch die lange Parameterversion angeben). In diesem Fall haben wir den optionalen Parameter --repeat hinzugefügt, der angibt, wie oft der String gedruckt werden muss. Wir haben auch das Standardschlüsselwort verwendet. Dies ist sehr wichtig, da wir dadurch den Wert angeben können, den das Attribut annimmt, wenn der Parameter beim Aufruf des Skripts nicht explizit angegeben wird.
Um zu überprüfen, ob der Parameter wie erwartet funktioniert, müssen wir an dieser Stelle nur unser Skript ändern, um das Drucken des Strings für die angegebene Anzahl von Malen zu wiederholen, daher schließen wir die Funktion print() in eine kleine for-Schleife ein:
for i in range(0, arguments.repeat):
print(arguments.printme)
Probieren wir es aus:
./printerscript.py --repeat=3 "hello world!"
hello world!
hello world!
hello world!
Alles lief wie erwartet. Darüber hinaus wurde auch die Hilfemeldung aktualisiert und enthält nun eine Beschreibung des neuen optionalen Parameters:
./printerscript.py --help
usage: printerscript.py [-h] [-r REPEAT] printme
simple script to demonstrate argparse usage
positional arguments:
printme The string to be printed
optional arguments:
-h, --help show this help message and exit
-r REPEAT, --repeat REPEAT
number of times to print the string
Wie oben erwähnt, geht argparse, wenn es erkennt, dass einem Parameter Bindestriche vorangestellt sind, davon aus, dass er optional ist. Um dieses Verhalten zu ändern und es als obligatorisch zu "deklarieren", können wir beim Hinzufügen des Parameters das Schlüsselwort required in der Form required=True verwenden.
Das Schlüsselwort "dest"
Normalerweise wird der für einen Parameter angegebene Wert als Attribut gespeichert, das nach dem ersten Argument benannt ist, das der Methode add_argument() übergeben wurde, wenn es sich um Positionsparameter handelt, oder um die erste lange Zeichenfolgenoption (wobei die Bindestriche entfernt wurden: die Zeichenkette –repeat wird zum Attribut 'repeat') im Falle von optionalen Parametern. Wenn im letzteren Fall keine Option für eine lange Zeichenkette verfügbar ist, wird die kurze Option verwendet. Mit dem Schlüsselwort dest können wir einen benutzerdefinierten Attributnamen angeben, anstatt uns auf dieses Verhalten zu verlassen.
Das Schlüsselwort "action"
Wenn wir die Methode add_argument() verwenden, können wir das Verhalten für die analysierten Optionen angeben, indem wir ein anderes Schlüsselwort verwenden: action. Die Standardaktion besteht darin, den übergebenen Wert dem entsprechenden Attribut zuzuweisen. Im Fall unseres winzigen Skripts wird beispielsweise der für den Parameter --repeat bereitgestellte Wert dem 'repeat'-Attribut des argparse zugewiesen. Namespace-Klasse, sobald die Argumente analysiert wurden. Dieses Verhalten kann jedoch auch geändert werden. Lassen Sie uns die anderen Hauptoptionen kurz beschreiben:
store_true und store_false
Indem wir diese Aktion angeben, sagen wir im Grunde, dass der Parameter kein Argument benötigt: True wird als Wert dem entsprechenden Attribut zugewiesen, wenn die Option angegeben wird, andernfalls False. store_true und store_false geben den Standardwert True bzw. False an.
Konstant speichern
Dies ähnelt der obigen Option, aber wenn Sie es als Wert für das Schlüsselwort action anstelle eines booleschen Werts verwenden, wird dem Attribut ein konstanter Wert zugewiesen, wenn der Parameter verwendet wird. Dieser Wert wird selbst mit dem Schlüsselwort const angegeben:
parser.add_argument("--random-option", action="store_const", const=yourvalue)anfügen
Wenn append als Wert des Schlüsselworts action verwendet wird, wird eine Liste erstellt und durch das entsprechende Parameterattribut referenziert: Der angegebene Wert wird an sie angehängt. Dies ist nützlich, falls der Parameter mehr als einmal angegeben wird:
parser.add_argument('--random-option', action="append")Konstant anfügen
Genau wie bei der Verwendung von append wird ein Wert an die Liste angehängt, auf die das Parameterattribut verweist. Der Unterschied besteht darin, dass in diesem Fall der Wert nicht vom Benutzer bereitgestellt, sondern beim Hinzufügen des Parameters erneut über das Schlüsselwort const deklariert wird:
parser.add_argument(
'--randomoption',
action="append_const",
const="the value to append"
)Sich gegenseitig ausschließende optionale Parameter
In bestimmten Situationen müssen wir möglicherweise einige Optionen so gestalten, dass sie sich gegenseitig ausschließen. Mit dem argparse-Modul können wir diese Aufgabe auf eine sehr einfache Art und Weise erledigen. Grundsätzlich werden wir eine separate Gruppe von Optionen mit der Methode add_mutually_exclusive_group() des Parser-Objekts erstellen und unsere Argumente hinzufügen. Zum Beispiel:
parser = argparse.ArgumentParser();
create our group of mutually exclusive arguments
mutually_exclusive = parser.add_mutually_exclusive_group()
mutually_exclusive.add_argument("--foo", help="foo excludes bar")
mutually_exclusive.add_argument("--bar", help="bar excludes foo")
Eine Sache, die Sie beachten sollten, ist, dass Argumente optional sein müssen, um Teil eines mutually_exclusive_group zu sein, daher sind Positionsargumente oder Argumente, die Sie als erforderlich definiert haben (required=True), darin nicht erlaubt.
An dieser Stelle sollten Sie eine Vorstellung davon haben, wie argparse funktioniert. Wir haben jedoch nur an der Oberfläche dessen gekratzt, was dieses Modul zu bieten hat: Für eine vollständige Beschreibung aller seiner Funktionen lesen Sie bitte die Dokumentation, Sie werden es nicht bereuen. Schönes Scripting!