Python lernen: Argparse-Modul

Wenn Sie mit Python an der Datenverarbeitung und -analyse beteiligt sind, müssen Sie früher oder später über das Jupyter-Notizbuch hinausgehen und Ihren Code in Skripte konvertieren, die über die Befehlszeile ausgeführt werden können. Hier bietet sich das Argparse-Modul an. Für Anfänger, die an das Jupyter-Notebook gewöhnt sind, bedeutet dieser Schritt, dass sie die Komfortzone verlassen und in eine neue Umgebung ziehen müssen. Das Material, dessen Übersetzung wir heute veröffentlichen, wurde geschrieben, um einen solchen Übergang zu erleichtern.


Argparse-Modul

Argparse-Modul


Das Argparse-Modul kann mit den Naturgewalten verglichen werden, die Berggipfel errichtet haben, die über den Wolken aufragen. Dank dieses Moduls in Skripten wird es möglich, mit dem zu arbeiten, was ohne seine Verwendung im Code dieser Skripte verborgen wäre.

Es ist zu beachten, dass argparse das empfohlene Standard-Python-Bibliotheksmodul für die Arbeit mit Befehlszeilenargumenten ist. Ich konnte kein gutes Argparse-Tutorial für Anfänger finden, deshalb habe ich beschlossen, selbst eines zu schreiben.

Leben jenseits des Jupyter-Notizbuchs


Als ich im Python-Skript, das ich für ein Projekt in meiner Freizeit benötigte, zum ersten Mal auf Argparse stieß, dachte ich: „Was ist diese mysteriöse Konstruktion?“ Danach habe ich den Code schnell auf das Jupyter-Notizbuch übertragen, aber ein solcher Schritt erwies sich als irrational.

Ich musste in der Lage sein, das Skript einfach auszuführen und nicht mit dem Jupyter-Notizbuch damit zu arbeiten. Ein eigenständiges Skript, das das argparse-Modul verwendet, wäre viel einfacher zu verwenden, und es wäre einfacher, daran zu arbeiten, als sich auf die Funktionen des Jupyter-Notizbuchs zu verlassen. Dann hatte ich es jedoch eilig und als ich mir die Argparse-Dokumentation ansah, konnte ich ihre Essenz nicht sofort erfassen, so dass ich nicht die Originalversion des Skripts verwendete.

Seitdem habe ich Argparse herausgefunden und dieses Modul hat mir sehr gut gefallen. Jetzt halte ich es für absolut wichtig. Es ist jedoch nicht so schwierig, es zu meistern.

Warum brauchen wir das Argparse-Modul?


Mit dem Argparse-Modul können Sie die Argumente analysieren, die an das Skript übergeben werden, wenn es über die Befehlszeile ausgeführt wird, und diese Argumente im Skript verwenden. Das heißt, wir sprechen über die Tatsache, dass dieses Modul es dem Skript ermöglicht, einige Daten zum Zeitpunkt seines Starts bereitzustellen, und dass das Skript diese Daten während der Ausführung seines Codes verwenden kann. Das Argparse-Modul ist ein Tool, mit dem Sie die Kommunikation zwischen dem Autor des Programms und demjenigen, der es verwendet, herstellen können, beispielsweise zwischen Ihnen, wenn Sie heute ein Skript schreiben, und Ihnen, wenn Sie es morgen starten, und etwas an es übergeben.

Die Verwendung von argparse bedeutet, dass der Benutzer bei Bedarf das Verhalten des Skripts ändern oder gegebenenfalls einige Daten darauf übertragen muss. Wenn diese vom Skriptautor bereitgestellt werden, muss der Benutzer den Programmcode nicht bearbeiten. Dadurch erhalten Skripte ein gewisses Maß an Flexibilität.

Beispiel


Angenommen, Sie möchten ein Skript schreiben, um Videodateien mithilfe der OpenCV-Bibliothek in normale Bilder zu konvertieren. Damit das Skript dieses Problem lösen kann, muss es den Ort kennen, an dem die Videodateien gespeichert sind, und den Ort, an dem Sie das fertige Bild ablegen müssen. Das heißt, er benötigt Informationen zu zwei Ordnern, deren Pfade, was nicht sehr praktisch ist, im Skriptcode fest codiert werden können, oder, was viel besser ist, Sie können den Benutzer das Skript angeben lassen, indem Sie sie beim Ausführen des Skripts als Befehlszeilenargumente eingeben. Um das Skript mit einer solchen Möglichkeit auszustatten, ist das argparse-Modul für uns nützlich. So könnte der Abschnitt des Skripts aussehen (nennen wir dieses Skript videos.py ), in dem die Befehlszeilenargumente analysiert werden:

 # videos.py import argparse parser = argparse.ArgumentParser(description='Videos to images') parser.add_argument('indir', type=str, help='Input dir for videos') parser.add_argument('outdir', type=str, help='Output dir for image') args = parser.parse_args() print(args.indir) 

Hier wird am Anfang der Datei das Argparse-Modul importiert. Anschließend wird mithilfe des Konstrukts argparse.ArgumentParser() ein argparse.ArgumentParser() mit seiner Beschreibung erstellt. Als nächstes wird mit der Methode parser.add_argument() die parser.add_argument() Variable indir , in der der Pfad mit Videodateien in den Ordner geschrieben werden soll. Gleichzeitig wird angezeigt, dass es sich um einen Zeichenfolgentyp handelt, und es werden auch Referenzinformationen dazu festgelegt. Danach wird auf die gleiche Weise die Variable outdir , in der der Pfad zu dem Ordner outdir wird, in den das Skript die auf der Grundlage von Videodateien erstellten Bilder outdir muss. Im nächsten Schritt wird das Ergebnis des Parsens der Befehlszeilenargumente in die Variable args . Was beim Start an das Skript übergeben wird, ist jetzt als indir und outdir Eigenschaft des args Objekts verfügbar. Jetzt können Sie mit diesen Werten arbeiten. In diesem Fall drucken wir einfach an die Konsole, was im indir Argument an das Skript indir .

So führen Sie dieses Skript über die Befehlszeile aus:

 python videos.py /videos /images 

Beachten Sie, dass die Zeilen /videos und /images nicht in Anführungszeichen gesetzt werden müssen. Ein auf diese Weise gestartetes Skript gibt die Zeile /videos an das Terminal aus und bestätigt damit die Möglichkeit, die ihm in seinem Code übergebenen Argumente zu verwenden. Dies ist die Magie von Argparse in Aktion.


Die Magie des Parsens von Befehlszeilenargumenten

Argparse Details


Wir haben uns nur ein einfaches Argparse-Beispiel angesehen. Lassen Sie uns nun einige Details zu Argparse besprechen.

▍ Positionsargumente


Die Erstellung des Formulars parser.add_argument('indir', type=str, help='Input dir for videos') videos.py parser.add_argument('indir', type=str, help='Input dir for videos') aus dem Skript videos.py soll ein Positionsargument erstellen. Beim Aufrufen eines Skripts ist die Reihenfolge wichtig, in der solche Argumente angegeben werden. Das erste an das Skript übergebene Argument wird also zum ersten Positionsargument, das zweite Argument zum zweiten Positionsargument.

Was passiert, wenn das Skript ohne Argumente ausgeführt wird, indem der Befehl python videos.py im Terminal ausgeführt wird?

In diesem Fall wird die folgende Fehlermeldung angezeigt:

 videos.py: error: the following arguments are required: indir, outdir 

Infolgedessen stellt sich heraus, dass zum Ausführen eines Skripts, das die Verwendung von Positionsargumenten vorsieht, solche Argumente immer angegeben werden sollten, wenn es ausgeführt wird.

▍ Optionale Argumente


Was passiert, wenn unser Skript mit dem Befehl python videos.py --help ausgeführt wird?

Als Antwort werden Hilfeinformationen dazu angezeigt. Dies sind genau die Informationen zu Positionsargumenten, die wir bei der Beschreibung der entsprechenden Variablen angegeben haben:

 usage: videos.py [-h] indir outdir Videos to images positional arguments: indir       Input dir for videos outdir      Output dir for image optional arguments: -h, --help  show this help message and exit 

Das Skript hat uns viele interessante Dinge darüber erzählt, was es vom Benutzer erwartet, und die help ist ein Beispiel für ein optionales Argument. Beachten Sie, dass --help (oder -h ) das einzige optionale Standardargument ist, das wir bei der Arbeit mit argparse verwenden können. Wenn Sie jedoch andere optionale Argumente benötigen, können Sie diese selbst erstellen.

Optionale Argumente werden auf die gleiche Weise wie Positionsargumente erstellt. Der Hauptunterschied zwischen den Befehlen zum Erstellen besteht darin, dass diese Namen bei der Angabe der Namen solcher Argumente mit einer Folge von Zeichen beginnen -- oder bei kurzen Argumenten mit einem Zeichen - . Beispielsweise könnte ein optionales Argument wie folgt erstellt werden:

 parser.add_argument('-m', '--my_optional') 

Hier ist ein Beispiel für das Erstellen und Verwenden optionaler Argumente. Beachten Sie, dass wir bei der Beschreibung des optionalen Arguments seinen Typ als int . Das heißt, es ist eine ganze Zahl. In einer ähnlichen Situation können Sie andere Python-Typen verwenden.

 # my_example.py import argparse parser = argparse.ArgumentParser(description='My example explanation') parser.add_argument(   '--my_optional',   type=int,   default=2,   help='provide an integer (default: 2)' ) my_namespace = parser.parse_args() print(my_namespace.my_optional) 

Das als --my_optional beschriebene --my_optional ist im Programm als Eigenschaft des my_namespace Objekts mit dem Namen my_optional .

Optionalen Argumenten können die Werte zugewiesen werden, die sie standardmäßig haben. Wenn in unserem Fall beim my_example des my_example Argument my_example kein Wert my_example wird, wird die Nummer 2 darauf geschrieben und an die Konsole ausgegeben. Um den Wert dieses Arguments während der Skriptausführung festzulegen, können Sie die folgende Konstruktion verwenden:

 python my_example.py  --my_optional=3 

Wofür kann Argparse noch verwendet werden?


Mit dem argparse-Modul können Python-Anwendungen entwickelt werden, die in Docker-Containern gepackt werden sollen. Wenn Sie beispielsweise beim Starten einer in einem Container gepackten Anwendung Befehlszeilenargumente übergeben müssen, können Sie diese in der Phase der Containerassemblierung in der Docker-Datei mithilfe der Anweisung RUN . Sie können die ENTRYPOINT oder ENTRYPOINT Anweisungen verwenden, um Skripts während der Containerausführung auszuführen. Details zu Dockerfiles finden Sie hier .

Zusammenfassung


Wir haben die grundlegenden Arbeitsmethoden mit dem argparse-Modul untersucht, mit denen Sie Ihre Skripte mit der Fähigkeit ausstatten können, Befehlszeilenargumente zu akzeptieren und zu verarbeiten. Es ist zu beachten, dass die Argparse-Funktionen dort nicht enden. Wenn Sie beispielsweise den Parameter nargs bei der Beschreibung von Argumenten verwenden, können Sie mit Argumentlisten arbeiten, und mit dem Parameter options können Sie Wertesätze angeben, die Argumente annehmen können. Nachdem Sie nun die Hauptfunktionen von Argparse beherrschen, können Sie dieses Modul ohne große Schwierigkeiten anhand der Dokumentation genauer untersuchen.

Wenn Sie es gewohnt sind, mit dem Jupyter-Notizbuch zu arbeiten, und sich von dieser Praxis entfernen möchten, finden Sie hier Materialien zum Arbeiten mit Umgebungsvariablen. Hier ist das Material zum repo2docker-Tool , mit dem Sie Jupyter Notebook-Repositorys in Docker-Images konvertieren können.

Liebe Leser! Wie arbeiten Sie mit Befehlszeilenargumenten in Python-Skripten?

Source: https://habr.com/ru/post/de440654/


All Articles