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-ModulArgparse-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:
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 BefehlszeilenargumentenArgparse 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.
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?
