[PYTHON] Einführung in die Verwendung von Argparse für Side-Dresser mit möglichst geringem Aufwand

Einführung

Wenn Sie eine Art Befehl (CLI) erstellen möchten, verwenden Sie argparse. Hier sind einige Tipps, wie Sie diesen Argparse bequem und bequem mit so wenig Aufwand wie möglich verwenden können.

Keine Notwendigkeit, sys.argv zu übergeben

In einigen Einführungen zur Verwendung von Argparse übergebe ich ernsthaft "sys.argv". Du brauchst nicht. Das Aufrufen von "parse_args ()" ohne Argumente reicht völlig aus.

import argparse


parser = argparse.ArgumentParser()
parser.parse_args()  #Das ist in Ordnung

Lassen Sie argparse die Anzeige von Hilfemeldungen übernehmen

Wenn Sie "-h" oder "--help" hinzufügen, fügt argparse automatisch die Funktion zum Anzeigen der Hilfemeldung hinzu. Darüber hinaus ist es praktisch, das Verhalten zu belassen, wenn Sie einen Fehler bei der Verwendung von argparse machen.

Sie müssen diese Art von Code beispielsweise nicht schreiben, wenn Sie ihn ohne Argumente ausführen.

import sys

#Dieser Code ist nicht erforderlich
if len(sys.argv) == 0:
    parser.parse_args(["-h"])

Ich wollte Ihnen nur sagen, dass es unnötig ist, weil dieser Artikel so viele gute Dinge enthält.

Nachtrag:

Es scheint, dass die Absicht dieses Codes war, bei Fehlern alle lange Hilfe statt kurze Verwendungsnachricht zu geben. Es ist ein bisschen hackig, aber Sie können es so schreiben (obwohl einige Leute vielleicht den Originalcode bevorzugen, der deutlich zeigt, was los ist):

parser.print_usage = parser.print_help

Für Positionsargumente

Wenn Sie nur ein Positionsargument angeben, wird das Fehlen von Argumenten automatisch überprüft, sodass Sie nichts tun müssen.

import argparse

parser = argparse.ArgumentParser("<command name>")
parser.add_argument("file")  # positional argument
args = parser.parse_args()
$ python cmd.py
usage: <command name> [-h] file
<command name>: error: the following arguments are required: file

Für Option

Wenn alles optional war, fügen Sie "erforderlich = Wahr" zu dem hinzu, was erforderlich zu sein scheint (obwohl bei Bedarf von einem Positionsargument die Rede ist).

import argparse

parser = argparse.ArgumentParser("<command name>")
parser.add_argument("--file", required=True)
args = parser.parse_args()
$ python cmd.py
usage: <command name> [-h] --file FILE
<command name>: error: the following arguments are required: file

Machen wir es einfacher, indem wir die Standardargumente angeben

Ein anderes mögliches Verhalten ist, wenn es ohne Angabe von Argumenten ausgeführt wird. Es wird durch Einbetten des Standardwerts verarbeitet. Dies kann mit default angegeben werden.

Beispielsweise möchten Sie möglicherweise einen Befehl erstellen, der Daten von der Standardeingabe empfängt, wenn Sie keine Datei angeben.

Für Positionsargumente

Wenn in einem Positionsargument angegeben, verwenden Sie nargs ="? ", Um es optional zu machen

import sys
import argparse


parser = argparse.ArgumentParser("hai")
parser.add_argument("file", nargs="?", type=argparse.FileType("r"), default=sys.stdin)
args = parser.parse_args()

print(args.file.read())

Das wird funktionieren.

$ cat hello.txt | python echo.py
$ python echo.py hello.txt

Für Option

Geben Sie für optionale Argumente einfach die Standardeinstellung an.

parser.add_argument("--file", type=argparse.FileType("r"), default=sys.stdin)

Machen wir es uns mit Action leichter

Es ist nützlich, sich an die Aktion zu erinnern, die vom Parser add_argument empfangen wurde. Sie müssen sich nicht an alles erinnern, aber es ist einfacher, sich an einige Aktionen zu erinnern.

Das Optionsargument lautet store_true / store_false

Verwenden Sie beispielsweise store_true, wenn Sie ein Flag wie "--with- " oder eine Option haben, die kein Argument wie "--debug" akzeptiert. Der Standardwert ist False

parser.add_argument("--debug", action="store_true")

Verwenden Sie umgekehrt store_false, wenn das Flag "--without- " lautet oder wenn der Standardwert auf "True" und die Option auf "False" gesetzt ist.

parser.add_argument("--execute", action="store_false")  #Standard ist trocken-Situation wie laufen

Beachten Sie, dass Sie die Standardwerte mit set_defaults () angeben sollten, wenn Sie sowohl die Flags "with-foo" als auch "without-foo" bereitstellen möchten. Andernfalls hängt der Standardwert von der Reihenfolge ab, in der Sie ihn geschrieben haben.

#Standard ist Debug=False
parser.add_argument("--without-debug", action="store_false", dest="debug")
parser.add_argument("--with-debug", action="store_true", dest="debug")
parser.set_defaults(debug=False)

Anhängen, wenn Sie mehrere Werte für dieselbe Option übergeben möchten

Wenn Sie mehrere Werte annehmen möchten, geben Sie zum Handeln anhängen an.

import argparse


parser = argparse.ArgumentParser()
parser.add_argument("--target", action="append")
args = parser.parse_args()
print(args)

Es funktioniert wie folgt.

$ python cmd.py --target x --target y --target z
Namespace(target=['x', 'y', 'z'])

Verwenden Sie Auswahlmöglichkeiten, wenn Sie den Bereich möglicher Werte einschränken möchten

Wenn Sie den Bereich möglicher Werte einschränken möchten, können Sie bequem Auswahlmöglichkeiten verwenden. Beispielsweise sollte der Teil, der die Protokollierungsstufe angibt, wie folgt geschrieben werden.

import argparse
import logging

parser = argparse.ArgumentParser()
loglevels = list(logging._nameToLevel.keys())  # _Es ist ein Präfix, daher ist es nicht gut erzogen.
parser.add_argument("--loglevel", choices=loglevels, default="INFO")

args = parser.parse_args()
logging.basicConfig(level=args.loglevel)
logger = logging.getLogger("log")

logger.debug("hmm..")
logger.info("hmm")

Ich denke, dass Informationen für die Standardeinstellung gut sind.

$ python cmd.py
INFO:log:hmm
$ python cmd.py -h
usage: cmd.py [-h]
                    [--loglevel {WARN,INFO,NOTSET,DEBUG,CRITICAL,WARNING,ERROR}]

optional arguments:
  -h, --help            show this help message and exit
  --loglevel {WARN,INFO,NOTSET,DEBUG,CRITICAL,WARNING,ERROR}
$ python cmd.py --loglevel=DEBUG
DEBUG:log:hmm..
INFO:log:hmm

Lesen Sie die Argparse-Dokumentation

Es ist nützlicher, sich das offizielle Dokument anzusehen, als diesen Artikel zu lesen, da die Erläuterung des offiziellen Dokuments im Detail nützlich ist. Siehe die offizielle Dokumentation.

Bonus

Unterbefehl

Wenn Sie einen Unterbefehl erstellen möchten, geben Sie argparse frühzeitig auf und verwenden Sie click.

Konvertieren Sie die Funktionsdefinition in einen Befehl

Danach ist es nützlich, sich ein Paket zu merken, das als Befehl aus der Funktionsdefinition ausgeführt werden kann (Ich habe es selbst gemacht).

Zum Beispiel ist es wie folgt.

# greeting.py
from handofcats import as_command

@as_command
def greeting(message, is_surprised=False, name="foo"):
    suffix = "!" if is_surprised else ""
    print("{name}: {message}{suffix}".format(name=name, message=message, suffix=suffix))
$ pip install handofcats
$ python greeting.py -h
python greeting.py -h
usage: greeting.py [-h] [--is-surprised] [--name NAME] [-v] [-q] message

positional arguments:
  message

optional arguments:
  -h, --help      show this help message and exit
  --is-surprised
  --name NAME
  -v, --verbose   (default option: increment logging level(default is
                  WARNING))
  -q, --quiet     (default option: decrement logging level(default is
                  WARNING))
$ python greeting.py
foo: hello
$ python greeting.py --is-surprised --name me hello
me: hello!

Recommended Posts

Einführung in die Verwendung von Argparse für Side-Dresser mit möglichst geringem Aufwand
Tipps für diejenigen, die verwirrt sind, wie man is und == in Python verwendet
Für diejenigen, die Bilder so schnell wie möglich nebeneinander mit matplotlib von Python anzeigen möchten
Wie benutzt man Python Argparse?
Personen, die mit Android-Programmen vertraut sind, versuchen die Multithread-Verarbeitung mit Python
Links zu Personen, die gerade mit der Datenanalyse mit Python beginnen
Verwendung eines externen Editors für die Python-Entwicklung mit Grasshopper
Python: So verwenden Sie Async mit
So verwenden Sie virtualenv mit PowerShell
Beginnen wir mit Python 3. ~ Für Kätzchen, die sich fragen, was sie als Hauptsprache wählen sollen ~
Wie man Selen so leicht wie möglich macht
Verwendung von ManyToManyField mit Djangos Admin
Verwendung von OpenVPN mit Ubuntu 18.04.3 LTS
Verwendung von Cmder mit PyCharm (Windows)
Wie man Ass / Alembic mit HtoA benutzt
Verwendung von Japanisch mit NLTK-Plot
[Python] Organisieren der Verwendung für Anweisungen
Verwendung des Jupyter-Notebooks mit ABCI
Verwendung des CUT-Befehls (mit Beispiel)
Verwendung von "deque" für Python-Daten
Verwendung der Fingerabdruckauthentifizierung für KDE
Verwendung von SQLAlchemy / Connect mit aiomysql
Verwendung des JDBC-Treibers mit Redash
Verwendung von OAuth und API für Dienstkonten mit Google API Client für Python