Standardowa biblioteka Pythona zawiera moduły do analizowania plików konfiguracyjnych ( configparser ), odczytu zmiennych środowiskowych ( os.environ ) i analizowania argumentów wiersza poleceń ( argparse ). Chcę napisać program, który robi to wszystko, a także:
Ma kaskadę wartości opcji :
- domyślne wartości opcji, nadpisane przez
- config pliku, nadpisane przez
- zmienne środowiskowe, nadpisane przez
- opcje wiersza poleceń.
Zezwala na jedną lub więcej lokalizacji plików konfiguracyjnych określonych w wierszu poleceń np.
--config-file foo.conf
I odczytuje je (zamiast lub oprócz zwykłego pliku konfiguracyjnego). To nadal musi być zgodne z powyższą kaskadą.Umożliwia definicje opcji w jednym miejscu w celu określenia zachowania podczas analizowania plików konfiguracyjnych i wiersza poleceń.
Łączy przeanalizowane opcje w jeden zbiór wartości opcji, do których reszta programu będzie miała dostęp bez dbania o to, skąd pochodzą.
Wszystko, czego potrzebuję, znajduje się najwyraźniej w standardowej bibliotece Pythona, ale nie współpracują ze sobą płynnie.
Jak mogę to osiągnąć przy minimalnym odchyleniu od standardowej biblioteki Pythona?
jterrace
dałem tu nagrodę, która popchnęła mnie na tyle, by spróbować swoich sił w zrobieniu czegoś takiego :)Odpowiedzi:
Moduł argparse sprawia, że nie jest to szalone, o ile jesteś zadowolony z pliku konfiguracyjnego, który wygląda jak wiersz poleceń. (Myślę, że to zaleta, ponieważ użytkownicy będą musieli nauczyć się tylko jednej składni). Ustawienie fromfile_prefix_chars na, na przykład
@
, sprawia, żejest równa
jeśli
@baz.conf
tak,Możesz nawet
foo.conf
automatycznie wyszukiwać kod, modyfikującargv
Format tych plików konfiguracyjnych można modyfikować, tworząc podklasę ArgumentParser i dodając metodę convert_arg_line_to_args .
źródło
AKTUALIZACJA: W końcu zabrałem się za umieszczenie tego na pypi. Zainstaluj najnowszą wersję przez:
Pełna pomoc i instrukcje są tutaj .
Oryginalny post
Oto małe coś, co razem zhakowałem. Zapraszam do sugerowania ulepszeń / raportów o błędach w komentarzach:
DO ZROBIENIA
Ta implementacja jest wciąż niekompletna. Oto częściowa lista rzeczy do zrobienia:
argparse
obsługuje komunikaty o błędachZgodność z udokumentowanym zachowaniem
dest
odargs
wadd_argument
, zamiast opierania się naAction
obiekcieparse_args
funkcję, która używaparse_known_args
. (np. kopiaparse_args
zcpython
implementacji, aby zagwarantować, że wywołujeparse_known_args
.)Mniej łatwe rzeczy…
Jeszcze tego nie próbowałem. Jest mało prawdopodobne - ale nadal możliwe! - że może po prostu zadziałać…
section
w pliku konfiguracyjnym).section
w pliku konfiguracyjnym.)źródło
pip install configargparser
Jest biblioteka, która robi dokładnie to o nazwie configglue .
To także obsługuje zmienne środowiskowe.
Istnieje również inna biblioteka o nazwie ConfigArgParse, która jest
Może Cię zainteresuje PyCon, rozmowa o konfiguracji autorstwa Łukasza Langi - Let Them Configure!
źródło
Chociaż nie próbowałem tego samodzielnie, istnieje biblioteka ConfigArgParse, która stwierdza, że robi większość rzeczy, które chcesz:
źródło
Wydaje się, że biblioteka standardowa nie rozwiązuje to, pozostawiając każdy programista do brukowanych
configparser
iargparse
ios.environ
wszyscy razem na przylegający sposobów.źródło
O ile wiem, standardowa biblioteka Pythona tego nie zapewnia. Rozwiązałem to samodzielnie, pisząc kod do użycia
optparse
iConfigParser
przeanalizowałem wiersz poleceń i pliki konfiguracyjne, a także zapewniłem na nich warstwę abstrakcji. Jednak potrzebowałbyś tego jako osobnej zależności, co z twojego wcześniejszego komentarza wydaje się nie do przyjęcia.Jeśli chcesz spojrzeć na kod, który napisałem, jest on pod adresem http://liw.fi/cliapp/ . Jest zintegrowany z moją biblioteką „struktury aplikacji wiersza poleceń”, ponieważ to duża część tego, co musi robić framework.
źródło
Ostatnio próbowałem czegoś takiego, używając „optparse”.
Ustawiłem go jako podklasę OptonParser z poleceniami „--Store” i „--Check”.
Poniższy kod powinien prawie Cię pokryć. Wystarczy, że zdefiniujesz własne metody „load” i „store”, które akceptują / zwracają słowniki, i jesteś bardzo gotowy.
źródło
Aby spełnić wszystkie te wymagania, zaleciłbym napisanie własnej biblioteki, która używa zarówno parsowania [opt | arg], jak i configparser dla podstawowej funkcjonalności.
Biorąc pod uwagę pierwsze dwa i ostatni warunek, powiedziałbym, że chcesz:
Krok pierwszy: wykonaj przebieg parsera wiersza poleceń, który szuka tylko opcji --config-file.
Krok drugi: przeanalizuj plik konfiguracyjny.
Krok trzeci: skonfiguruj drugi przebieg parsera wiersza poleceń, używając danych wyjściowych przebiegu pliku konfiguracyjnego jako wartości domyślnych.
Trzecie wymaganie prawdopodobnie oznacza, że musisz zaprojektować swój własny system definicji opcji, aby ujawnić wszystkie funkcje optparse i configparser, na których Ci zależy, oraz napisać kilka instalacji hydraulicznych, aby wykonać konwersje pomiędzy nimi.
źródło
Oto moduł, który zhakowałem razem, który odczytuje argumenty wiersza poleceń, ustawienia środowiska, pliki ini i wartości kluczy. Jest również dostępny w skrócie .
źródło
Możesz użyć do tego ChainMap. Spójrz na mój przykład, który przedstawiłem w sekcji „Jaki jest najlepszy sposób na nadpisanie opcji konfiguracyjnych w wierszu poleceń w Pythonie?” SO pytanie.
źródło
Biblioteka Confect I zbudowany jest właśnie spełniają większość wymagań.
Może dołączyć opcje wiersza poleceń do kliknięcia poleceń
(przepraszam, to nie jest argumentacja, ale kliknięcie jest lepsze i znacznie bardziej zaawansowane.
confect
Może obsługiwać argparse w przyszłej wersji).confect
ładuje pliki konfiguracyjne Pythona, a nie JSON / YMAL / TOML / INI. Podobnie jak plik profilu IPython lub plik ustawień DJANGO, plik konfiguracyjny Pythona jest elastyczny i łatwiejszy w utrzymaniu.Więcej informacji można znaleźć w pliku README.rst w repozytorium projektu . Należy pamiętać, że obsługuje on tylko Python3.6 w górę.
Przykłady
Dołączanie opcji wiersza poleceń
Automatycznie tworzy obszerną wiadomość pomocy ze wszystkimi zadeklarowanymi właściwościami i wartościami domyślnymi.
Ładowanie zmiennych środowiskowych
Do załadowania zmiennych środowiskowych wystarczy jedna linia
źródło