Ich bin ursprünglich ein C-Programmierer. Ich habe zahlreiche Tricks und "Hacks" gesehen, um viele verschiedene Argumente zu lesen.
Wie können Python-Programmierer dies tun?
verbunden
- Wie lassen sich Befehlszeilenargumente, die an ein Python-Skript übergeben werden, am besten erfassen / analysieren?
- Implementieren von Befehlszeilenschnittstellen im Stil "[Befehl] [Aktion] [Parameter]"?
- Wie kann ich Befehlszeilenargumente in Python verarbeiten?
- Wie formatiere ich Positionsargumente mithilfe von Pythons Optparse?
python
command-line
command-line-arguments
Martineau
quelle
quelle
Antworten:
Die kanonische Lösung in der Standardbibliothek lautet
argparse
( docs ):Hier ist ein Beispiel:
argparse
unterstützt (unter anderem):quelle
optparse
veraltet ist, ist der Fragesteller der Frage kein Mitglied mehr im Stapelüberlauf. Dies ist die akzeptierte Antwort auf eine gut sichtbare Frage. Bitte überlegen Sie, Ihren Beispielcode vollständig neu zu schreiben, umargparse
stattdessen stdlib zu verwenden.sys.argv
ist eine Liste, die alle Argumente enthält, die in der Befehlszeile an das Skript übergeben wurden.Grundsätzlich,
quelle
sys.argv[1:]
(vermeidet den Skriptnamen).Ich gehe einfach herum und evangelisiere für Argparse, was aus diesen Gründen besser ist . Im Wesentlichen:
(vom Link kopiert)
Das argparse-Modul kann positionelle und optionale Argumente verarbeiten, während optparse nur optionale Argumente verarbeiten kann
argparse ist nicht dogmatisch darüber, wie Ihre Befehlszeilenschnittstelle aussehen soll - Optionen wie -file oder / file werden ebenso unterstützt wie erforderliche Optionen. Optparse weigert sich, diese Merkmale zu unterstützen, und zieht Reinheit der Praktikabilität vor
argparse erzeugt informativere Verwendungsnachrichten, einschließlich der aus Ihren Argumenten ermittelten Befehlszeilenverwendung, und Hilfemeldungen für Positions- und optionale Argumente. Das optparse-Modul erfordert das Schreiben einer eigenen Verwendungszeichenfolge und kann keine Hilfe für Positionsargumente anzeigen.
argparse unterstützt Aktionen, die eine variable Anzahl von Befehlszeilenargumenten verbrauchen, während optparse erfordert, dass die genaue Anzahl von Argumenten (z. B. 1, 2 oder 3) im Voraus bekannt ist
argparse unterstützt Parser, die an Unterbefehle senden, während optparse
allow_interspersed_args
das manuelle Festlegen und Ausführen des Parser-Versands erfordertUnd mein persönlicher Favorit:
add_argument()
mit einfachen aufrufbaren Elementen angegeben werden, während für optparse das Hacken von Klassenattributen wieSTORE_ACTIONS
oderCHECK_METHODS
eine ordnungsgemäße Argumentprüfung erforderlich istquelle
-f
oder angegeben wurden--foo
, während "genaue Anzahl der Argumente im Voraus bekannt sein" vermutlich Positionsargumente ohne vorhergehende Optionsflags bedeutet.Es gibt auch ein
argparse
stdlib-Modul (eine "Verbesserung" des stdlib-optparse
Moduls). Beispiel aus der Einführung zu argparse :Verwendungszweck:
quelle
Eine Möglichkeit ist die Verwendung
sys.argv
. Dadurch werden der Skriptname als erstes Argument und alle anderen Parameter gedruckt, die Sie an ihn übergeben.quelle
Die docopt- Bibliothek ist wirklich schick . Es erstellt ein Argument dikt aus der Verwendungszeichenfolge für Ihre App.
ZB aus der docopt readme:
quelle
Wenn Sie etwas schnelles und nicht sehr flexibles brauchen
main.py:
Dann renne
python main.py James Smith
um die folgende Ausgabe zu erzeugen:
quelle
python main.py "James Smith"
welchen putsJames Smith
insys.argv[1]
und erzeugt ein ,IndexError
wenn Sie versuchen , die nicht vorhandene zu verwendensys.argv[2]
. Das Zitierverhalten hängt etwas davon ab, von welcher Plattform und Shell Sie Python ausführen.python main.py "James Joseph Smith"
? Wenn Sie sich mit Index außerhalb der Grenzen befassen, können Sie die Anzahl der bereitgestellten Argumente überprüfen. Weniger realistisch oder nicht, mein Beispiel zeigt, wie man mit mehreren Argumenten umgeht.gmail-trash-msg.py MessageID
. Diese Antwort ist direkt an denMessageID
Testparameter übergeben wordensys.argv[1]
.quelle
Ich benutze selbst optparse, aber ich mag die Richtung, die Simon Willison mit seiner kürzlich eingeführten optfunc- Bibliothek einschlägt . Es funktioniert durch:
So zum Beispiel diese Funktionsdefinition:
wird in diesen optparse Hilfetext umgewandelt:
quelle
Ich mag getopt von stdlib, zB:
In letzter Zeit habe ich etwas Ähnliches verpackt, um die Dinge weniger ausführlich zu machen (z. B. "-h" implizit zu machen).
quelle
Pocoos Klick ist intuitiver, erfordert weniger Boilerplate und ist mindestens so leistungsfähig wie Argparse.
Die einzige Schwäche, auf die ich bisher gestoßen bin, ist, dass Sie nicht viel anpassen können, um Seiten zu helfen, aber das ist normalerweise keine Voraussetzung, und docopt scheint die klare Wahl zu sein, wenn dies der Fall ist.
quelle
Wie Sie sehen können, ist optparse "Das optparse-Modul ist veraltet und wird nicht weiterentwickelt. Die Entwicklung wird mit dem argparse- Modul fortgesetzt ."
quelle
quelle
Vielleicht interessiert Sie ein kleines Python-Modul, das ich geschrieben habe, um die Handhabung von Befehlszeilenargumenten noch einfacher zu machen (Open Source und kostenlos) - Commando
quelle
Ich empfehle einen Blick auf docopt als einfache Alternative zu diesen anderen zu betrachten.
docopt ist ein neues Projekt, bei dem Ihre --help-Verwendungsnachricht analysiert wird, anstatt dass Sie alles selbst implementieren müssen. Sie müssen nur Ihre Nutzungsnachricht in das POSIX-Format stellen.
quelle
Eine weitere Option ist Argh . Es baut auf Argparse auf und lässt Sie Dinge schreiben wie:
Es wird automatisch Hilfe usw. generiert, und Sie können Dekorateure verwenden, um zusätzliche Anleitungen zur Funktionsweise des Arg-Parsing zu geben.
quelle
argh
ist einfacher als andere Bibliotheken oder Verwendensys
.argh
aber es ist nicht besonders geeignet für Szenarien, in denen Ihr größter Wunsch darin besteht, keinen Befehl mit Unterbefehlen zu haben.def frobnicate_spleches(...)
eine Funktion zu definieren, die alles tut, was Ihr Skript tut, und dannif __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
am Ende der Datei.Meine Lösung ist entrypoint2 . Beispiel:
Hilfstext:
quelle