Jaka jest najłatwiejsza , najkrótsza i najbardziej elastyczna metoda lub biblioteka do analizowania argumentów wiersza poleceń Pythona?
Jaka jest najłatwiejsza , najkrótsza i najbardziej elastyczna metoda lub biblioteka do analizowania argumentów wiersza poleceń Pythona?
Ta odpowiedź sugeruje, optparse
które rozwiązanie jest odpowiednie dla starszych wersji Pythona. W przypadku Python 2.7 i nowszych argparse
zamienia optparse
. Zobacz tę odpowiedź, aby uzyskać więcej informacji.
Jak zauważyli inni, lepiej wybrać optparse niż getopt. getopt jest mapowaniem jeden do jednego standardowych funkcji biblioteki getopt (3) C i nie jest bardzo łatwy w użyciu.
optparse, choć jest nieco bardziej gadatliwy, ma znacznie lepszą strukturę i jest łatwiejsze do rozszerzenia w późniejszym terminie.
Oto typowy wiersz, aby dodać opcję do analizatora składni:
parser.add_option('-q', '--query',
action="store", dest="query",
help="query string", default="spam")
Prawie mówi samo za siebie; w czasie przetwarzania przyjmuje -q lub --query jako opcje, przechowuje argument w atrybucie o nazwie zapytanie i ma wartość domyślną, jeśli go nie określisz. Jest to również dokumentowanie sam w sobie, ponieważ deklarujesz argument pomocy (który zostanie użyty, gdy zostanie uruchomiony z opcją -h / - help) z opcją.
Zwykle analizujesz argumenty za pomocą:
options, args = parser.parse_args()
Spowoduje to domyślną analizę standardowych argumentów przekazanych do skryptu (sys.argv [1:])
options.query zostanie wówczas ustawiona na wartość przekazaną do skryptu.
Parser tworzy się po prostu przez wykonanie
parser = optparse.OptionParser()
To wszystko, czego potrzebujesz. Oto kompletny skrypt Pythona, który to pokazuje:
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 linii pytona, które pokazują podstawy.
Zapisz go w sample.py i uruchom raz
python sample.py
i raz z
python sample.py --query myquery
Poza tym przekonasz się, że optparse można bardzo łatwo rozszerzyć. W jednym z moich projektów stworzyłem klasę Command, która umożliwia łatwe zagnieżdżanie podkomend w drzewie poleceń. Silnie wykorzystuje optparse do łączenia poleceń. Nie jest to coś, co mogę łatwo wyjaśnić w kilku wierszach, ale możesz swobodnie przeglądać w moim repozytorium klasę główną, a także klasę, która z niej korzysta i parser opcji
-mcProfile -o program.prof
ale agrparcer przechwytuje te argumenty, jak przekazać te argumenty do exe Pythona ???argparse
jest droga. Oto krótkie podsumowanie tego, jak z niego korzystać:1) Zainicjuj
2) Dodaj argumenty
3) Analizuj
4) Dostęp
5) Sprawdź wartości
Stosowanie
Prawidłowe użycie:
Błędne argumenty:
Pełna pomoc:
źródło
Korzystanie z docopt
Od 2012 roku istnieje bardzo łatwy, wydajny i naprawdę fajny moduł do analizy argumentów o nazwie docopt . Oto przykład zaczerpnięty z jego dokumentacji:
Więc to jest to: 2 linie kodu plus ciąg dokumentów, który jest niezbędny, a argumenty są analizowane i dostępne w obiekcie argumentów.
Korzystanie z python-fire
Od 2017 roku istnieje kolejny fajny moduł o nazwie python-fire . Może wygenerować interfejs CLI dla twojego kodu, gdy parsujesz zero argumentów. Oto prosty przykład z dokumentacji (ten mały program udostępnia funkcję
double
do wiersza poleceń):Z wiersza poleceń możesz uruchomić:
źródło
Nowy sposób hop jest
argparse
dla tych powodów. argparse> optparse> getoptAktualizacja: Jak z py2.7 argparse jest częścią biblioteki standardowej i optparse jest przestarzała.
źródło
Wolę kliknij . Wyodrębnia zarządzanie opcjami i pozwala „(...) tworzyć piękne interfejsy wiersza poleceń w łatwy do skomponowania sposób z tak małą ilością kodu, jak to konieczne”.
Oto przykładowe użycie:
Automatycznie generuje również dobrze sformatowane strony pomocy:
źródło
Niemal wszyscy używają getopt
Oto przykładowy kod dla dokumentu:
Jednym słowem, oto jak to działa.
Masz dwa rodzaje opcji. Ci, którzy otrzymują argumenty, i ci, którzy są jak przełączniki.
sys.argv
jest prawiechar** argv
w twoim C. Podobnie jak w C pomijasz pierwszy element, który jest nazwą twojego programu i analizujesz tylko argumenty:sys.argv[1:]
Getopt.getopt
przeanalizuje to zgodnie z regułą, którą podasz w argumencie."ho:v"
tutaj opisuje krótkie argumenty-ONELETTER
. Te:
środki, które-o
akceptuje jeden argument.Wreszcie
["help", "output="]
opisuje długie argumenty (--MORETHANONELETTER
). Wynik=
po raz kolejny oznacza, że dane wyjściowe akceptują jeden argument.Wynikiem jest lista par (opcja, argument)
Jeśli opcja nie przyjmuje żadnego argumentu (jak
--help
tutaj),arg
część jest pustym ciągiem. Następnie zwykle chcesz zapętlić tę listę i przetestować nazwę opcji jak w przykładzie.Mam nadzieję, że to ci pomogło.
źródło
getopt
w nowszych wersjach Pythona ta odpowiedź jest nieaktualna.getopt
nadal nie jest przestarzały… Ale jego dokumentacja stwierdza, że jest on przeznaczony głównie dla użytkowników zaznajomionych zgetopt()
funkcją C i potwierdza, że dla innych użytkownikówargparse
może być lepszym rozwiązaniem, pozwalającym „napisać mniej kodu i uzyskać lepsza pomoc i komunikaty o błędach ”.Użyj,
optparse
który jest dostarczany ze standardową biblioteką. Na przykład:Źródło: Używanie Pythona do tworzenia narzędzi wiersza poleceń UNIX
Jednak od wersji Python 2.7 optparse jest przestarzałe, zobacz: Dlaczego warto używać argparse zamiast optparse?
źródło
Na wszelki wypadek może to pomóc, jeśli chcesz przechwycić argumenty Unicode w Win32 (2K, XP itp.):
źródło
Domyślne argumenty linii poleceń
Chociaż
argparse
jest świetny i jest właściwą odpowiedzią na w pełni udokumentowane przełączniki wiersza poleceń i zaawansowane funkcje, możesz użyć domyślnych argumentów funkcji, aby bardzo prosto obsługiwać proste argumenty pozycyjne.Argument „nazwa” przechwytuje nazwę skryptu i nie jest używany. Wyjście testowe wygląda następująco:
W przypadku prostych skryptów, w których chcę tylko wartości domyślne, uważam to za wystarczające. Możesz także uwzględnić przymus typu w wartościach zwracanych lub wszystkie wartości wiersza poleceń będą ciągami.
źródło
Wolę optparse niż getopt. Jest bardzo deklaratywny: podajesz nazwy opcji i efekty, które powinny one mieć (np. Ustawiając pole boolowskie), i przekazuje ci słownik wypełniony zgodnie ze specyfikacjami.
http://docs.python.org/lib/module-optparse.html
źródło
Myślę, że najlepszym sposobem dla większych projektów jest optparse, ale jeśli szukasz łatwego sposobu, może http://werkzeug.pocoo.org/documentation/script jest dla Ciebie.
Zasadniczo każda funkcja action_ * jest widoczna w wierszu poleceń, a miły komunikat pomocy jest generowany za darmo.
źródło
declarative_parser
. Oczywiście, jeśli ktoś pracuje z werkzeug, może być lepiej zachowaćwerkzung.script
. W każdym razie jestem wielkim fanem takiego podejścia.Kod argparse może być dłuższy niż rzeczywisty kod implementacyjny!
Jest to problem, który widzę w przypadku najbardziej popularnych opcji analizy argumentów polega na tym, że jeśli parametry są tylko skromne, kod do ich udokumentowania staje się nieproporcjonalnie duży z korzyścią, którą zapewniają.
Względnym nowicjuszem w scenie analizowania argumentów (myślę) jest plac .
Dokonuje pewnych uznanych kompromisów z argparse, ale używa wbudowanej dokumentacji i owija się wokół
main()
funkcji funkcji typu:źródło
Consoleargs zasługuje na wzmiankę tutaj. Jest bardzo łatwy w użyciu. Sprawdź to:
Teraz w konsoli:
źródło
Oto metoda, a nie biblioteka, która wydaje mi się działać.
Cele tutaj są zwięzłe, każdy argument parsowany przez pojedynczy wiersz, argumenty w linii dla czytelności, kod jest prosty i nie zależy od żadnych specjalnych modułów (tylko os + sys), z wdziękiem ostrzega o brakujących lub nieznanych argumentach , użyj prostej pętli for / range () i działa w Pythonie 2.xi 3.x
Pokazane są dwie flagi przełączania (-d, -v) oraz dwie wartości kontrolowane przez argumenty (-i xxx i -o xxx).
Celem NextArg () jest zwrócenie następnego argumentu podczas sprawdzania brakujących danych, a „skip” pomija pętlę, gdy używana jest NextArg (), utrzymując parsowanie flagi do jednego linijki.
źródło
Rozszerzyłem podejście Erco, aby uwzględnić wymagane argumenty pozycyjne i argumenty opcjonalne. Powinny one poprzedzać argumenty -d, -v itp.
Argumenty pozycyjne i opcjonalne można pobrać odpowiednio za pomocą PosArg (i) i OptArg (i, domyślnie). Po znalezieniu opcjonalnego argumentu pozycja początkowa wyszukiwania opcji (np. -I) przesuwa się o 1 do przodu, aby uniknąć spowodowania „nieoczekiwanego” błędu.
źródło