Diese Antwort stammt von Steven Bethard in Google-Gruppen . Ich poste es hier erneut, um Menschen ohne Google-Konto den Zugriff zu erleichtern.
Sie können das Standardverhalten der error
Methode überschreiben :
import argparse
import sys
class MyParser(argparse.ArgumentParser):
def error(self, message):
sys.stderr.write('error: %s\n' % message)
self.print_help()
sys.exit(2)
parser = MyParser()
parser.add_argument('foo', nargs='+')
args = parser.parse_args()
Beachten Sie, dass die obige Lösung die Hilfemeldung druckt, wenn die error
Methode ausgelöst wird. Druckt beispielsweise test.py --blah
auch die Hilfemeldung, wenn dies --blah
keine gültige Option ist.
Wenn Sie die Hilfemeldung nur drucken möchten, wenn in der Befehlszeile keine Argumente angegeben sind, ist dies möglicherweise immer noch der einfachste Weg:
import argparse
import sys
parser=argparse.ArgumentParser()
parser.add_argument('foo', nargs='+')
if len(sys.argv)==1:
parser.print_help(sys.stderr)
sys.exit(1)
args=parser.parse_args()
Beachten Sie, dass parser.print_help()
standardmäßig auf Standard gedruckt wird. Verwenden Sie , wie in init_js vorgeschlagen , parser.print_help(sys.stderr)
zum Drucken in stderr.
parser.print_usage()
anstelle von verwende, enthältparser.print_help()
die Hilfemeldung die Verwendung, ist jedoch ausführlicher.error()
scheint mir eine schreckliche Idee zu sein. Es dient einem anderen Zweck und ist nicht zum Drucken einer benutzerfreundlichen Verwendung oder Hilfe gedacht.Anstatt eine Klasse zu schreiben, kann stattdessen ein try / Except verwendet werden
Der Vorteil ist, dass der Workflow klarer ist und Sie keine Stub-Klasse benötigen. Der Nachteil ist, dass die erste Verwendungszeile zweimal gedruckt wird.
Dies erfordert mindestens ein verbindliches Argument. Ohne obligatorische Argumente ist die Angabe von null Argumenten in der Befehlszeile gültig.
quelle
-h
Flag verwendet wird, und unnötige Drucke helfen, wenn ein--version
Flag verwendet wird. Um diese Probleme zu mindern, können Sie den Fehlertyp wieexcept SystemExit as err: if err.code == 2: parser.print_help()
Mit Argparse könnten Sie tun:
quelle
parser.parse_args()
Wenn Sie Argumente haben, die angegeben werden müssen, damit das Skript ausgeführt werden kann, verwenden Sie den erforderlichen Parameter für ArgumentParser wie folgt: -
parse_args () meldet einen Fehler, wenn das Skript ohne Argumente ausgeführt wird.
quelle
Wenn Sie Standardfunktionen für (Unter-) Parser zuordnen, wie unter erwähnt
add_subparsers
, können Sie diese einfach als Standardaktion hinzufügen:Fügen Sie den Versuch hinzu, außer wenn Sie Ausnahmen aufgrund fehlender Positionsargumente auslösen.
quelle
Die sauberste Lösung besteht darin, das Standardargument manuell zu übergeben, wenn in der Befehlszeile keines angegeben wurde:
Vollständiges Beispiel:
Dies gibt die vollständige Hilfe aus (keine kurze Verwendung), wenn sie ohne Argumente aufgerufen wird.
quelle
sys.argv[1:]
ist eine sehr verbreitete Redewendung. Ich seheparser.parse_args(None if sys.argv[1:] else ['-h'])
idiomatischer und sauberer.Wirf meine Version hier auf den Stapel:
Sie werden vielleicht bemerken, dass
parser.exit
- ich mache es hauptsächlich so, weil es eine Importzeile speichert, wenn dies der einzige Grundsys
in der Datei war ...quelle
not vars(args)
funktioniert möglicherweise nicht, wenn Argumente einedefault
Methode haben.Es gibt ein Paar Einzeiler mit
sys.argv[1:]
(eine sehr verbreitete Python-Redewendung, um auf die Befehlszeilenargumente zu verweisen, wobei es sich umsys.argv[0]
den Namen des Skripts handelt), die diese Aufgabe erfüllen können.Der erste ist selbsterklärend, sauber und pythonisch:
Der zweite ist etwas hackiger. Die Kombination der zuvor bewerteten Tatsache , dass eine leere Liste ist
False
mit derTrue == 1
undFalse == 0
Äquivalenzen Sie diese:Vielleicht zu viele Klammern, aber ziemlich klar, wenn eine vorherige Argumentauswahl getroffen wurde.
quelle
Die
parser.exit
Methode akzeptiert auch einenstatus
(Rückkehrcode) und einenmessage
Wert (einschließlich eines nachgestellten Zeilenumbruchs!).ein meinungsbild, :)
Beispielaufrufe:
quelle
Stellen Sie Ihre Positionsargumente mit nargs ein und prüfen Sie, ob die Positionsargumente leer sind.
Referenz Python nargs
quelle
Hier ist eine andere Möglichkeit, wenn Sie etwas Flexibles benötigen, bei dem Sie Hilfe anzeigen möchten, wenn bestimmte Parameter übergeben werden, keines oder mehr als 1 widersprüchliches Argument:
Prost!
quelle
Wenn Ihr Befehl ein Befehl ist, bei dem ein Benutzer eine Aktion auswählen muss, verwenden Sie eine sich gegenseitig ausschließende Gruppe mit required = True .
Dies ist eine Art Erweiterung der Antwort von pd321.
Ausgabe:
Dies gibt nur die grundlegende Hilfe. Und einige der anderen Antworten geben Ihnen die volle Hilfe. Aber zumindest wissen Ihre Benutzer, dass sie -h können
quelle
Dies ist nicht gut (auch, weil alle Fehler abgefangen werden), aber:
Hier ist die Definition der
error
Funktion derArgumentParser
Klasse:https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Wie Sie sehen, werden nach der Signatur zwei Argumente benötigt. Funktionen außerhalb der Klasse kennen jedoch nichts über das erste Argument:
self
Dies ist grob gesagt ein Parameter für die Klasse. (Ich weiß, dass Sie wissen , ...) Dadurch nur eigene passierenself
undmessage
in_error(...)
nicht (wird ausgegeben:
). Sie können
parser
(self
) in_error
function übergeben, indem Sie es aufrufen:, aber Sie möchten das Programm jetzt nicht beenden. Dann gib es zurück:
. Trotzdem
parser
weiß es nicht, dass es geändert wurde. Wenn also ein Fehler auftritt, sendet es die Ursache dafür (übrigens seine lokalisierte Übersetzung). Nun, dann fangen Sie es ab:. Wenn nun ein Fehler auftritt und
parser
die Ursache dafür gesendet wird, werden Sie ihn abfangen, sich das ansehen und ... wegwerfen.quelle