Die Standardbibliothek von Python enthält Module für das Parsen von Konfigurationsdateien ( configparser ), das Lesen von Umgebungsvariablen ( os.environ ) und das Parsen von Befehlszeilenargumenten ( argparse ). Ich möchte ein Programm schreiben, das all das kann, und auch:
Hat eine Kaskade von Optionswerten :
- Standardoptionswerte, überschrieben von
- Konfigurationsdateioptionen, überschrieben von
- Umgebungsvariablen, überschrieben von
- Befehlszeilenoptionen.
Ermöglicht einen oder mehrere in der Befehlszeile mit z. B. angegebene Speicherorte für Konfigurationsdateien
--config-file foo.conf
und liest diesen (entweder anstelle oder zusätzlich zu der üblichen Konfigurationsdatei). Dies muss immer noch der obigen Kaskade entsprechen.Ermöglicht Optionsdefinitionen an einem einzigen Ort , um das Analyseverhalten für Konfigurationsdateien und die Befehlszeile zu bestimmen.
Vereinheitlicht die analysierten Optionen in einer einzigen Sammlung von Optionswerten, auf die der Rest des Programms zugreifen kann, ohne sich darum zu kümmern, woher sie stammen.
Alles, was ich brauche, befindet sich anscheinend in der Python-Standardbibliothek, aber sie arbeiten nicht reibungslos zusammen.
Wie kann ich dies mit minimaler Abweichung von der Python-Standardbibliothek erreichen?
jterrace
, dass ich hier ein Kopfgeld gegeben habe, um mich so weit über den Rand zu schieben, dass ich versuchen kann, so etwas zu tun :)Antworten:
Das argparse-Modul macht dies nicht verrückt, solange Sie mit einer Konfigurationsdatei zufrieden sind, die wie eine Befehlszeile aussieht. (Ich denke, dies ist ein Vorteil, da Benutzer nur eine Syntax lernen müssen.) Wenn Sie beispielsweise fromfile_prefix_chars auf einstellen , wird Folgendes
@
erreicht:ist äquivalent zu
wenn
@baz.conf
ja,Sie können Ihren Code sogar
foo.conf
automatisch ändern lassen, indem Sie ihn ändernargv
Das Format dieser Konfigurationsdateien kann geändert werden, indem eine Unterklasse von ArgumentParser erstellt und eine Methode convert_arg_line_to_args hinzugefügt wird.
quelle
UPDATE: Ich bin endlich dazu gekommen, dies auf Pypi zu setzen. Installieren Sie die neueste Version über:
Vollständige Hilfe und Anweisungen finden Sie hier .
Ursprünglicher Beitrag
Hier ist etwas, das ich zusammen gehackt habe. Fühlen Sie sich frei, Verbesserungen / Fehlerberichte in den Kommentaren vorzuschlagen:
MACHEN
Diese Implementierung ist noch unvollständig. Hier ist eine teilweise TODO-Liste:
argparse
mit Fehlermeldungen umgegangen wirdEntspricht dem dokumentierten Verhalten
dest
vonargs
inadd_argument
, anstatt sich auf die zu verlassenAction
Objektparse_args
Funktion, die verwendetparse_known_args
. (zB Kopieparse_args
von dercpython
Implementierung, um sicherzustellen, dass sie aufgerufen wirdparse_known_args
.)Weniger einfaches Zeug…
Ich habe noch nichts davon ausprobiert. Es ist unwahrscheinlich - aber immer noch möglich! -, dass es einfach funktionieren könnte ...
section
in der Konfigurationsdatei erhalten.)section
in der Konfigurationsdatei einen erhalten.)quelle
pip install configargparser
Es gibt eine Bibliothek, die genau dies tut und als Konfigurationskleber bezeichnet wird .
Es werden auch Umgebungsvariablen unterstützt .
Es gibt auch eine andere Bibliothek namens ConfigArgParse , die ist
Vielleicht interessiert Sie PyCon auch über die Konfiguration von Łukasz Langa - Let Them Configure!
quelle
Obwohl ich es nicht selbst ausprobiert habe, gibt es die ConfigArgParse- Bibliothek, die angibt, dass sie die meisten gewünschten Aufgaben ausführt :
quelle
Es scheint , die Standard - Bibliothek ist dies nicht ein , jeden Programmierer zu Cobble verlassen
configparser
undargparse
undos.environ
alle zusammen in klobigen Wegen.quelle
Die Python-Standardbibliothek bietet dies meines Wissens nicht. Ich löste diese für mich durch das Schreiben von Code zu verwenden ,
optparse
undConfigParser
die Befehlszeilen und Konfigurationsdateien und bietet eine Abstraktionsschicht auf sie zu analysieren. Sie würden dies jedoch als separate Abhängigkeit benötigen, was aus Ihrem früheren Kommentar unangenehm erscheint.Wenn Sie sich den Code ansehen möchten, den ich geschrieben habe, finden Sie ihn unter http://liw.fi/cliapp/ . Es ist in meine Bibliothek "Command Line Application Framework" integriert, da dies einen großen Teil der Aufgaben des Frameworks ausmacht.
quelle
Ich habe kürzlich so etwas mit "optparse" ausprobiert.
Ich habe es als Unterklasse von OptonParser mit den Befehlen '--Store' und '--Check' eingerichtet.
Der folgende Code sollte Sie so ziemlich abgedeckt haben. Sie müssen nur Ihre eigenen "Laden" - und "Speichern" -Methoden definieren, die Wörterbücher akzeptieren / zurückgeben, und Sie sind viel Beute.
quelle
Um all diese Anforderungen zu erfüllen, würde ich empfehlen, eine eigene Bibliothek zu schreiben, die sowohl [opt | arg] parse als auch configparser für die zugrunde liegende Funktionalität verwendet.
Angesichts der ersten beiden und der letzten Anforderung würde ich sagen, dass Sie Folgendes möchten:
Schritt eins: Führen Sie einen Befehlszeilen-Parser-Pass durch, der nur nach der Option --config-file sucht.
Schritt zwei: Analysieren Sie die Konfigurationsdatei.
Schritt drei: Richten Sie einen zweiten Befehlszeilen-Parser-Pass ein, wobei Sie standardmäßig die Ausgabe des Konfigurationsdateipasses verwenden.
Die dritte Anforderung bedeutet wahrscheinlich, dass Sie Ihr eigenes Optionsdefinitionssystem entwerfen müssen, um alle Funktionen von optparse und configparser verfügbar zu machen, die Ihnen wichtig sind, und einige Installationsarbeiten schreiben müssen, um dazwischen Konvertierungen durchzuführen.
quelle
Hier ist ein Modul, das ich zusammen gehackt habe und das auch Befehlszeilenargumente, Umgebungseinstellungen, INI-Dateien und Schlüsselringwerte liest. Es ist auch im Kern verfügbar .
quelle
Sie können hierfür ChainMap verwenden. Schauen Sie sich mein Beispiel an, das ich in "Wie lassen sich Konfigurationsoptionen in der Befehlszeile in Python am besten überschreiben?" SO Frage.
quelle
Die Bibliothek confect I gebaut ist genau die meisten Ihrer Bedürfnisse zu erfüllen.
Es kann Kommandozeilen - Optionen zu einigen anhängen Klick - Befehle
(Entschuldigung, es ist kein Argparse, aber das Klicken ist besser und viel fortgeschrittener.
confect
Möglicherweise wird Argparse in der zukünftigen Version unterstützt.)confect
Python-Konfigurationsdateien geladen werden, nicht JSON / YMAL / TOML / INI. Genau wie die IPython-Profildatei oder die DJANGO-Einstellungsdatei ist die Python-Konfigurationsdatei flexibel und einfacher zu warten.Weitere Informationen finden Sie in der README.rst im Projekt-Repository . Beachten Sie, dass nur Python3.6 unterstützt wird.
Beispiele
Anhängen von Befehlszeilenoptionen
Es wird automatisch eine umfassende Hilfemeldung mit allen deklarierten Eigenschaften und Standardwerten erstellt.
Umgebungsvariablen laden
Es wird nur eine Zeile zum Laden von Umgebungsvariablen benötigt
quelle