Die Dokumentation für das Argparse-Python-Modul ist zwar ausgezeichnet, aber sicher zu viel, als dass mein kleines Anfängerhirn sie jetzt verstehen könnte . Ich muss nicht in der Befehlszeile rechnen oder mich in Formatierungszeilen auf dem Bildschirm einmischen oder Optionszeichen ändern. Alles, was ich tun möchte, ist "Wenn arg A ist, mach das, wenn B das macht, wenn keiner der oben genannten Hilfe zeigt und beende" .
529
sys.argv
Antworten:
Mein Verständnis der ursprünglichen Frage ist zweifach. Erstens bin ich in Bezug auf das einfachste mögliche Argparse-Beispiel überrascht, dass ich es hier nicht gesehen habe. Um ganz einfach zu sein, es ist natürlich auch alles Overhead mit wenig Strom, aber es könnte Ihnen den Einstieg erleichtern.
Aber dieses Positionsargument ist jetzt erforderlich. Wenn Sie es beim Aufrufen dieses Programms weglassen, wird eine Fehlermeldung bezüglich fehlender Argumente angezeigt. Dies führt mich zum zweiten Teil der ursprünglichen Frage. Matt Wilkie scheint ein einzelnes optionales Argument ohne ein benanntes Label (die --option-Labels) zu wollen. Mein Vorschlag wäre, den obigen Code wie folgt zu ändern:
Es mag eine elegantere Lösung geben, aber diese funktioniert und ist minimalistisch.
quelle
So mache ich das
argparse
(mit mehreren Argumenten):args
wird ein Wörterbuch sein, das die Argumente enthält:In Ihrem Fall fügen Sie einfach nur ein Argument hinzu.
quelle
foo.py --action install
oderfoo.py --action remove
statt einfachfoo.py install
parser.add_argument('install', help='Install the app')
(Beachten Sie, dass Sie kein Positionsargument mit definieren könnenrequired=True
)args
Diktat wie oben erzeugt wurde.args.foo
undargs.bar
anstelle der Wörterbuchsyntax zuzugreifen . In beiden Fällen ist das natürlich in Ordnung, aber args ist eigentlich kein Wörterbuch, sondern einargparse.Namespace
Objekt.Die
argparse
Dokumentation ist recht gut, lässt jedoch einige nützliche Details aus, die möglicherweise nicht offensichtlich sind. (@Diego Navarro hat bereits einige davon erwähnt, aber ich werde versuchen, seine Antwort leicht zu erweitern.) Die grundlegende Verwendung ist wie folgt:Das Objekt, von dem Sie zurückkehren,
parse_args()
ist ein 'Namespace'-Objekt: Ein Objekt, dessen Mitgliedsvariablen nach Ihren Befehlszeilenargumenten benannt sind. DasNamespace
Objekt ist, wie Sie auf Ihre Argumente und die damit verbundenen Werte zugreifen:(Beachten Sie, dass
argparse
beim Benennen der Variablen '-' in Ihren Argumentnamen durch Unterstriche ersetzt wird.)In vielen Situationen möchten Sie Argumente möglicherweise einfach als Flags verwenden, die keinen Wert annehmen. Sie können diese in argparse wie folgt hinzufügen:
Mit dem obigen Befehl werden Variablen mit dem Namen 'foo' mit dem Wert True bzw. 'no_foo' mit dem Wert False erstellt:
Beachten Sie auch, dass Sie die Option "Erforderlich" verwenden können, wenn Sie ein Argument hinzufügen:
Wenn Sie dieses Argument in der Befehlszeile weglassen, werden Sie auf diese Weise darauf hingewiesen
argparse
, dass es fehlt, und die Ausführung Ihres Skripts gestoppt.Beachten Sie schließlich, dass es möglich ist, mithilfe der
vars
Funktion eine Diktatstruktur Ihrer Argumente zu erstellen , wenn dies Ihnen das Leben erleichtert.Wie Sie sehen können, wird
vars
ein Diktat mit Ihren Argumentnamen als Schlüssel und deren Werten als ähm Werte zurückgegeben.Es gibt viele andere Optionen und Dinge, die Sie tun können, aber dies sollte die wichtigsten, häufigsten Verwendungsszenarien abdecken.
quelle
'-f'
und'-b'
? Warum kannst du das nicht weglassen?man cp
oder tun, werdenman ls
Sie feststellen, dass viele Optionen in beiden Geschmacksrichtungen erhältlich sind (z-f, --force
. B. ). Es gibt wahrscheinlich sehr unterschiedliche Gründe, warum die Leute das eine oder andere bevorzugen, aber auf jeden Fall ist es ziemlich normal, beide Formulare in Ihrem Programm verfügbar zu machen.Matt fragt nach Positionsparametern in Argparse, und ich stimme zu, dass die Python-Dokumentation zu diesem Aspekt fehlt. Es gibt kein einziges vollständiges Beispiel auf den ~ 20 ungeraden Seiten, das sowohl das Parsen als auch die Verwendung von Positionsparametern zeigt .
Keine der anderen Antworten hier zeigt auch ein vollständiges Beispiel für Positionsparameter. Hier ist ein vollständiges Beispiel:
Das, was mich abschreckte, war, dass argparse das benannte Argument "--foo-bar" in "foo_bar" konvertiert, aber ein Positionsparameter namens "foo-bar" bleibt als "foo-bar", was es weniger offensichtlich macht, wie Verwenden Sie es in Ihrem Programm.
Beachten Sie die beiden Zeilen am Ende meines Beispiels - keine dieser Zeilen funktioniert, um den Wert des Positionsparameters für die Balkenleiste zu ermitteln. Der erste ist offensichtlich falsch (es ist ein arithmetischer Ausdruck args.foo minus bar), aber der zweite funktioniert auch nicht:
Wenn Sie das
foo-bar
Attribut verwenden möchten , müssen Sie es verwendengetattr
, wie in der letzten Zeile meines Beispiels gezeigt. Was verrückt ist, ist, dass wenn Sie versuchen,dest=foo_bar
den Eigenschaftsnamen in etwas zu ändern, auf das leichter zugegriffen werden kann, eine wirklich bizarre Fehlermeldung angezeigt wird:So läuft das obige Beispiel ab:
quelle
nargs='?'
ist die Beschwörung für eine "optionale Position" gemäß stackoverflow.com/questions/4480075/…foo-bar
nicht transformiert wird,foo_bar
wird in bugs.python.org/issue15125 behandelt .print args.foo_bar
funktionieren. Da es sich um ein Positionsargument handelt, müssen Sie beim Aufrufen des Skripts keinen Namen angeben, sodass dies für den Benutzer keine Rolle spielt.getattr
(es ist auch flexibler, da Sie ein Argument von optional in positionell ändern können, ohne den Code ändern zu müssen, der den Wert verwendet).Noch eine zusammenfassende Einführung, inspiriert von diesem Beitrag .
Argumente werden mit Kombinationen der folgenden definiert:
Allgemeine Optionen sind:
--help
es verwendet wird.float
oder erwartenint
(andernfallsstr
).'-x', '--long-name', dest='longName'
. B. ).Hinweis: Standardmäßig
--long-name
wird mit zugegriffenargs.long_name
store_true, store_false
: für boolesche Argumente'--foo', action='store_true' => args.foo == True
store_const
: zur Verwendung mit Optionconst
'--foo', action='store_const', const=42 => args.foo == 42
count
: für wiederholte Optionen wie in./myscript.py -vv
'-v', action='count' => args.v == 2
append
: für wiederholte Optionen wie in./myscript.py --foo 1 --foo 2
'--foo', action='append' => args.foo == ['1', '2']
./myscript.py --foo a b => args.foo = ['a', 'b']
type=int
).quelle
Beachten Sie das Argparse-Tutorial in Python-HOWTOs . Es beginnt mit den meisten grundlegenden Beispielen wie diesem:
und geht zu weniger grundlegenden über.
Es gibt ein Beispiel mit vordefinierter Auswahl für eine Option, wie z. B. das, was gefragt wird:
quelle
Folgendes habe ich mir in meinem Lernprojekt hauptsächlich dank @DMH ausgedacht ...
Demo-Code:
Dies hat sich möglicherweise weiterentwickelt und ist online verfügbar: command-line.py
Skript, um diesen Code zu trainieren : command-line-demo.sh
quelle
Sie können auch plac (einen Wrapper
argparse
) verwenden.Als Bonus werden nette Hilfeanweisungen generiert - siehe unten.
Beispielskript:
Beispielausgabe:
Keine Argumente angegeben -
example.py
:Unerwartetes Argument geliefert -
example.py C
:Richtiges Argument angegeben -
example.py A
:Vollständiges Hilfemenü (automatisch generiert) -
example.py -h
:Kurze Erklärung:
Der Name des Arguments entspricht normalerweise dem Parameternamen (
arg
).Die Tupelanmerkung nach dem
arg
Parameter hat folgende Bedeutung:Argument with two possible values
)positional
)None
)None
)['A', 'B']
)Dokumentation:
Weitere Informationen zur Verwendung von plac finden Sie in der großartigen Dokumentation:
quelle
Um zu dem hinzuzufügen, was andere gesagt haben:
Normalerweise verwende ich gerne den Parameter 'dest', um einen Variablennamen anzugeben, und verwende dann 'globals (). Update ()', um diese Variablen in den globalen Namespace einzufügen.
Verwendungszweck:
Code:
quelle
argparse
Verwendet interngetattr
undsetattr
greift auf Werte im Namespace zu. Auf diese Weise werden seltsam geformtedest
Werte nicht gestört .Eine wirklich einfache Möglichkeit, argparse zu verwenden und die Schalter '-h' / '--help' zu ändern, um Ihre eigenen Hilfeanweisungen für persönlichen Code anzuzeigen, besteht darin, die Standardhilfe auf False zu setzen. Sie können auch beliebig viele zusätzliche .add_arguments hinzufügen ::
Führen Sie Folgendes aus: python test.py -h
Ausgabe:
quelle
Die einfachste Antwort!
PS Derjenige, der das Dokument von Argparse geschrieben hat, ist dumm
Python-Code:
Code ausführen
quelle