Jestem pierwotnie programistą C. Widziałem wiele sztuczek i „hacków”, aby przeczytać wiele różnych argumentów.
W jaki sposób programiści Python mogą to zrobić?
Związane z
- Jaki jest najlepszy sposób przechwytywania / analizowania argumentów wiersza poleceń przekazanych do skryptu Python?
- Wdrażasz interfejsy wiersza polecenia w stylu „[polecenie] [akcja] [parametr]?
- Jak mogę przetwarzać argumenty wiersza poleceń w Pythonie?
- Jak sformatować pomocnicze argumenty pozycyjne przy użyciu optparse Pythona?
python
command-line
command-line-arguments
martineau
źródło
źródło
Odpowiedzi:
Kanoniczne rozwiązanie w standardowej bibliotece to
argparse
( dokumenty ):Oto przykład:
argparse
obsługuje (między innymi):źródło
optparse
jest przestarzały, pytający nie jest już członkiem w przypadku przepełnienia stosu, i jest to akceptowana odpowiedź na bardzo widoczne pytanie - rozważ całkowite przepisanie przykładowego kodu, abyargparse
zamiast tego użyć stdlib .sys.argv
to lista zawierająca wszystkie argumenty przekazane do skryptu w wierszu poleceń.Gruntownie,
źródło
sys.argv[1:]
(unika się nazwy skryptu).Chodzę ewangelizując dla argparse, co jest lepsze z tych powodów .. zasadniczo:
(skopiowane z linku)
moduł argparse może obsługiwać argumenty pozycyjne i opcjonalne, podczas gdy optparse może obsługiwać tylko argumenty opcjonalne
Argparse nie jest dogmatyczny, jak powinien wyglądać interfejs wiersza poleceń - obsługiwane są opcje takie jak -file lub / file, podobnie jak wymagane opcje. Optparse odmawia obsługi tych funkcji, woląc czystość od praktyczności
argparse produkuje bardziej pouczające komunikaty o użyciu, w tym użycie wiersza polecenia określone na podstawie argumentów, oraz komunikaty pomocy dla argumentów pozycyjnych i opcjonalnych. Moduł optparse wymaga napisania własnego ciągu użycia i nie ma możliwości wyświetlenia pomocy dla argumentów pozycyjnych.
argparse obsługuje działania, które zużywają zmienną liczbę argumentów wiersza poleceń, podczas gdy optparse wymaga wcześniejszej znajomości dokładnej liczby argumentów (np. 1, 2 lub 3)
argparse obsługuje parsery, które wysyłają do komend podrzędnych, podczas gdy optparse wymaga
allow_interspersed_args
ręcznego ustawienia i wykonania parseraI mój osobisty faworyt:
add_argument()
za pomocą prostych wywołań, podczas gdy optparse wymaga hakowania atrybutów klasy takich jakSTORE_ACTIONS
lub,CHECK_METHODS
aby uzyskać poprawne sprawdzenie argumentówźródło
-f
lub--foo
, natomiast „dokładna liczba argumentów powinna być znana z góry” prawdopodobnie oznacza argumenty pozycyjne podane bez żadnych flag opcji.Istnieje również
argparse
moduł stdlib („ulepszenie”optparse
modułu stdlib ). Przykład ze wstępu do argparse :Stosowanie:
źródło
Jednym ze sposobów na to jest użycie
sys.argv
. Spowoduje to wydrukowanie nazwy skryptu jako pierwszego argumentu i wszystkich innych przekazanych mu parametrów.źródło
Docopt biblioteka jest bardzo śliski. Tworzy argument argumentu na podstawie ciągu użycia aplikacji.
Np. Z pliku readopt docopt:
źródło
Jeśli potrzebujesz czegoś szybkiego i niezbyt elastycznego
main.py:
Następnie uruchomić
python main.py James Smith
w celu uzyskania następującego wyniku:
źródło
python main.py "James Smith"
co stawiaJames Smith
wsys.argv[1]
i wytwarzaIndexError
podczas próby korzystania z nieistniejącychsys.argv[2]
. Cytowanie będzie w pewnym stopniu zależeć od platformy i powłoki, z której uruchamiasz Python.python main.py "James Joseph Smith"
? Jeśli masz problem z indeksem poza granicami, możesz dodać sprawdzanie liczby podanych argumentów. Mniej realistyczne czy nie, mój przykład pokazuje, jak radzić sobie z wieloma argumentami.gmail-trash-msg.py MessageID
. Ta odpowiedź jest prosta, aby przekazaćMessageID
parametr testowysys.argv[1]
.źródło
Sam używam optparse, ale naprawdę podoba mi się kierunek, w którym podąża Simon Willison ze swoją niedawno wprowadzoną biblioteką optfunc . Działa przez:
Na przykład ta definicja funkcji:
zamienia się w ten tekst pomocy optparse:
źródło
Lubię getopt z stdlib, np .:
Ostatnio pakuję coś podobnego do tego, aby rzeczy były mniej gadatliwe (np. Ukrywanie „-h”).
źródło
Pocoo za kliknięcie jest bardziej intuicyjna, wymaga mniej szablonowe, a jest co najmniej tak mocny jak argparse.
Jedyną słabością, jaką do tej pory napotkałem, jest to, że nie można dokonać wielu dostosowań stron pomocy, ale zwykle nie jest to wymagane, a docopt wydaje się być oczywistym wyborem.
źródło
Jak widać optparse „Moduł optparse jest przestarzały i nie będzie dalej rozwijany; rozwój będzie kontynuowany z modułem argparse ”.
źródło
źródło
Być może interesuje Cię mały moduł Pythona, który napisałem, aby jeszcze bardziej ułatwić obsługę argumentów wiersza poleceń (open source i swobodny w użyciu) - Commando
źródło
Polecam spojrzenie na docopt jako prostą alternatywę dla tych innych.
docopt to nowy projekt, który działa, analizując komunikat o użytkowaniu --help, zamiast wymagać od Ciebie implementacji wszystkiego samodzielnie. Musisz tylko umieścić komunikat o użyciu w formacie POSIX.
źródło
Jeszcze inną opcją jest argh . Opiera się na argparse i pozwala pisać takie rzeczy jak:
Automatycznie wygeneruje pomoc i tak dalej, a można użyć dekoratorów, aby zapewnić dodatkowe wskazówki na temat tego, jak powinna działać analiza arg.
źródło
argh
jest łatwiejsze niż inne biblioteki lib lub używaniesys
.argh
ale nie jest to szczególnie odpowiednie w scenariuszach, w których twoim największym pragnieniem jest nie mieć polecenia z podkomendami.def frobnicate_spleches(...)
zdefiniowanie funkcji, która robi wszystko, co robi skrypt, a następnie zrobienie tegoif __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
na końcu pliku.Moje rozwiązanie to entrypoint2 . Przykład:
Tekst pomocy:
źródło