Was ist die einfachste , knappste und flexibelste Methode oder Bibliothek zum Parsen von Python-Befehlszeilenargumenten?
Was ist die einfachste , knappste und flexibelste Methode oder Bibliothek zum Parsen von Python-Befehlszeilenargumenten?
Diese Antwort schlägt vor, optparse
welche für ältere Python-Versionen geeignet ist. Für Python 2.7 und höher, argparse
ersetzt optparse
. Weitere Informationen finden Sie in dieser Antwort .
Wie andere Leute betonten, ist es besser, mit optparse über getopt zu gehen. getopt ist so ziemlich eine Eins-zu-Eins-Zuordnung der Standardfunktionen der getopt (3) C-Bibliothek und nicht sehr einfach zu bedienen.
optparse ist zwar etwas ausführlicher, aber viel besser strukturiert und später einfacher zu erweitern.
Hier ist eine typische Zeile, um Ihrem Parser eine Option hinzuzufügen:
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
Es spricht so ziemlich für sich selbst; Zur Verarbeitungszeit akzeptiert es -q oder --query als Optionen, speichert das Argument in einem Attribut namens query und hat einen Standardwert, wenn Sie ihn nicht angeben. Es ist auch selbstdokumentierend, dass Sie das Hilfeargument (das bei Ausführung mit -h / - help verwendet wird) genau dort mit der Option deklarieren.
Normalerweise analysieren Sie Ihre Argumente mit:
options, args = parser.parse_args()
Dadurch werden standardmäßig die an das Skript übergebenen Standardargumente analysiert (sys.argv [1:]).
options.query wird dann auf den Wert gesetzt, den Sie an das Skript übergeben haben.
Sie erstellen einen Parser einfach dadurch
parser = optparse.OptionParser()
Dies sind alle Grundlagen, die Sie benötigen. Hier ist ein vollständiges Python-Skript, das dies zeigt:
import optparse
parser = optparse.OptionParser()
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
options, args = parser.parse_args()
print 'Query string:', options.query
5 Python-Zeilen, die Ihnen die Grundlagen zeigen.
Speichern Sie es in sample.py und führen Sie es einmal mit aus
python sample.py
und einmal mit
python sample.py --query myquery
Darüber hinaus werden Sie feststellen, dass Optparse sehr einfach zu erweitern ist. In einem meiner Projekte habe ich eine Befehlsklasse erstellt, mit der Sie Unterbefehle einfach in einem Befehlsbaum verschachteln können. Optparse wird häufig verwendet, um Befehle miteinander zu verketten. Es ist nicht einfach in ein paar Zeilen zu erklären, aber Sie können in meinem Repository nach der Hauptklasse sowie einer Klasse, die sie verwendet, und dem Optionsparser suchen
-mcProfile -o program.prof
aber agrparcer erfasst diese Argumente. Wie übergebe ich diese Argumente an Python Exe?argparse
ist der Weg zu gehen. Hier ist eine kurze Zusammenfassung der Verwendung:1) Initialisieren
2) Argumente hinzufügen
3) Analysieren
4) Zugang
5) Prüfwerte
Verwendung
Richtige Verwendung:
Falsche Argumente:
Volle Hilfe:
quelle
Docopt verwenden
Seit 2012 gibt es ein sehr einfaches, leistungsstarkes und wirklich cooles Modul zum Parsen von Argumenten namens docopt . Hier ist ein Beispiel aus der Dokumentation:
Das ist es also: 2 Zeilen Code plus Ihre doc String, ist wesentlich und Sie erhalten Ihre Argumente in Ihren Argumenten Objekt analysiert und zur Verfügung.
Mit Python-Feuer
Seit 2017 gibt es ein weiteres cooles Modul namens Python-Fire . Es kann eine CLI-Schnittstelle für Ihren Code generieren, während Sie keine Argumente analysieren. Hier ist ein einfaches Beispiel aus der Dokumentation (dieses kleine Programm stellt die Funktion
double
der Befehlszeile zur Verfügung):Über die Befehlszeile können Sie Folgendes ausführen:
quelle
Der neue Hüftweg ist
argparse
aus diesen Gründen. argparse> optparse> getoptUpdate: Ab py2.7 ist argparse Teil der Standardbibliothek und optparse ist veraltet.
quelle
Ich bevorzuge Click . Es abstrahiert Verwaltungsoptionen und ermöglicht "(...) das Erstellen schöner Befehlszeilenschnittstellen auf komponierbare Weise mit so wenig Code wie nötig".
Hier ist ein Beispiel für die Verwendung:
Außerdem werden automatisch gut formatierte Hilfeseiten generiert:
quelle
So ziemlich jeder benutzt getopt
Hier ist der Beispielcode für das Dokument:
Mit einem Wort, hier ist, wie es funktioniert.
Sie haben zwei Arten von Optionen. Diejenigen, die Argumente erhalten, und diejenigen, die wie Schalter sind.
sys.argv
ist so ziemlich Ihrchar** argv
in C. Wie in C überspringen Sie das erste Element, das der Name Ihres Programms ist, und analysieren nur die Argumente:sys.argv[1:]
Getopt.getopt
analysiert es gemäß der Regel, die Sie im Argument angeben."ho:v"
Hier werden die kurzen Argumente beschrieben :-ONELETTER
. Das:
bedeutet das-o
ein Argument akzeptiert wird.Schließlich
["help", "output="]
lange Argumente beschreibt (--MORETHANONELETTER
). Das=
After-Ausgabe bedeutet erneut, dass die Ausgabe ein Argument akzeptiert.Das Ergebnis ist eine Liste von Paaren (Option, Argument)
Wenn eine Option kein Argument akzeptiert (wie
--help
hier), ist dasarg
Teil eine leere Zeichenfolge. In der Regel möchten Sie dann diese Liste durchlaufen und den Optionsnamen wie im Beispiel testen.Ich hoffe das hat dir geholfen.
quelle
getopt
in neueren Versionen von Python ist diese Antwort veraltet.getopt
ist es immer noch nicht veraltet ... In der Dokumentation heißt es jedoch, dass es hauptsächlich für Benutzer bereitgestellt wird, die mit der C-getopt()
Funktion vertraut sind , und dass andere Benutzerargparse
möglicherweise eine bessere Lösung sind, um "weniger Code schreiben und abrufen zu können" bessere Hilfe und Fehlermeldungen ".Verwendung,
optparse
die mit der Standardbibliothek geliefert wird. Beispielsweise:Quelle: Verwenden von Python zum Erstellen von UNIX-Befehlszeilentools
Ab Python 2.7 ist optparse jedoch veraltet. Weitere Informationen finden Sie unter: Warum argparse anstelle von optparse verwenden?
quelle
Für den Fall , müssen Sie möglicherweise auf, das helfen kann , wenn Sie benötigen greifen Unicode - Argumente auf Win32 (2K, XP etc.):
quelle
Die Standardeinstellungen für Lightweight-Befehlszeilenargumente
Obwohl
argparse
es großartig ist und die richtige Antwort für vollständig dokumentierte Befehlszeilenoptionen und erweiterte Funktionen ist, können Sie die Standardeinstellungen für Funktionsargumente verwenden, um einfache Positionsargumente sehr einfach zu handhaben.Das Argument 'name' erfasst den Skriptnamen und wird nicht verwendet. Die Testausgabe sieht folgendermaßen aus:
Für einfache Skripte, bei denen ich nur einige Standardwerte möchte, finde ich dies völlig ausreichend. Möglicherweise möchten Sie auch einen Typzwang in die Rückgabewerte aufnehmen, oder Befehlszeilenwerte sind alle Zeichenfolgen.
quelle
Ich bevorzuge optparse gegenüber getopt. Es ist sehr aussagekräftig: Sie geben die Namen der Optionen und die Auswirkungen an, die sie haben sollten (z. B. Festlegen eines Booleschen Felds), und Sie erhalten ein Wörterbuch zurück, das gemäß Ihren Spezifikationen gefüllt ist.
http://docs.python.org/lib/module-optparse.html
quelle
Ich denke, der beste Weg für größere Projekte ist optparse, aber wenn Sie nach einem einfachen Weg suchen, ist http://werkzeug.pocoo.org/documentation/script vielleicht etwas für Sie.
Grundsätzlich ist also jede Funktion action_ * der Befehlszeile ausgesetzt und eine nette Hilfemeldung wird kostenlos generiert.
quelle
declarative_parser
. Wenn man mit werkzeug arbeitet, ist es natürlich besser, das zu behaltenwerkzung.script
. Wie auch immer, ich bin ein großer Fan eines solchen Ansatzes.Argparse-Code kann länger sein als der tatsächliche Implementierungscode!
Das ist ein Problem, das ich bei den meisten gängigen Optionen zum Parsen von Argumenten finde: Wenn Ihre Parameter nur bescheiden sind, wird der Code, um sie zu dokumentieren, zum Nutzen, den sie bieten, unverhältnismäßig groß.
Ein relativer Neuling in der Argument-Parsing-Szene (glaube ich) ist plac .
Es macht einige anerkannte Kompromisse mit Argparse, verwendet jedoch Inline-Dokumentation und umschließt einfach die Typfunktionsfunktion
main()
:quelle
consoleargs verdient es, hier erwähnt zu werden. Es ist sehr einfach zu bedienen. Hör zu:
Jetzt in der Konsole:
quelle
Hier ist eine Methode, keine Bibliothek, die für mich zu funktionieren scheint.
Die Ziele hier sind knapp zu sein, jedes Argument wird durch eine einzelne Zeile analysiert, die Argumente werden zur besseren Lesbarkeit angezeigt, der Code ist einfach und hängt nicht von speziellen Modulen ab (nur os + sys), warnt vor fehlenden oder unbekannten Argumenten Verwenden Sie eine einfache for / range () -Schleife und arbeiten Sie mit Python 2.x und 3.x.
Dargestellt sind zwei Umschaltflags (-d, -v) und zwei durch Argumente gesteuerte Werte (-i xxx und -o xxx).
Das Ziel von NextArg () ist es, das nächste Argument zurückzugeben, während nach fehlenden Daten gesucht wird, und 'überspringen' die Schleife zu überspringen, wenn NextArg () verwendet wird, wobei das Flag auf einen Liner reduziert wird.
quelle
Ich habe den Ansatz von Erco erweitert, um erforderliche Positionsargumente und optionale Argumente zu berücksichtigen. Diese sollten vor den Argumenten -d, -v usw. stehen.
Positions- und optionale Argumente können mit PosArg (i) bzw. OptArg (i, Standard) abgerufen werden. Wenn ein optionales Argument gefunden wird, wird die Startposition für die Suche nach Optionen (z. B. -i) um 1 nach vorne verschoben, um zu vermeiden, dass ein "unerwarteter" Todesfall auftritt.
quelle