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.
sys.argv
zu übergebenIn 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
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
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
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
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.
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
Geben Sie für optionale Argumente einfach die Standardeinstellung an.
parser.add_argument("--file", type=argparse.FileType("r"), default=sys.stdin)
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.
Verwenden Sie beispielsweise store_true, wenn Sie ein Flag wie "--with-
parser.add_argument("--debug", action="store_true")
Verwenden Sie umgekehrt store_false, wenn das Flag "--without-
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)
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'])
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
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.
Wenn Sie einen Unterbefehl erstellen möchten, geben Sie argparse frühzeitig auf und verwenden Sie click.
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!