Dokumentacja dla argparse moduł Pythona , podczas gdy doskonała Jestem pewien, jest zbyt dużo dla mój malutki Początkujący mózg do uchwycenia chwili. Nie muszę robić matematyki w wierszu poleceń ani mieszać się z formatowaniem linii na ekranie ani zmieniać znaków opcji. Wszystko, co chcę zrobić, to „Jeśli arg to A, zrób to, jeśli B to zrób, jeśli żadne z powyższych nie pokaże pomocy i wyjdź” .
529
sys.argv
argument, który chcesz ...Odpowiedzi:
Moje rozumienie pierwotnego pytania jest dwojakie. Po pierwsze, jeśli chodzi o najprostszy możliwy przykładowy argument, jestem zaskoczony, że go tutaj nie widziałem. Oczywiście, aby być śmiertelnie prostym, wszystko to jest również kosztowne z niewielką mocą, ale może zacząć.
Ale ten argument pozycyjny jest teraz wymagany. Jeśli pominiesz to podczas wywoływania tego programu, pojawi się błąd dotyczący brakujących argumentów. To prowadzi mnie do drugiej części pierwotnego pytania. Wydaje się, że Matt Wilkie chce pojedynczego opcjonalnego argumentu bez nazwanej etykiety (etykiety opcji). Moją sugestią byłoby zmodyfikowanie powyższego kodu w następujący sposób:
Może być bardziej eleganckie rozwiązanie, ale działa i jest minimalistyczne.
źródło
Oto sposób, w jaki to robię
argparse
(z wieloma argumentami):args
będzie słownikiem zawierającym argumenty:W twoim przypadku wystarczy dodać tylko jeden argument.
źródło
foo.py --action install
lubfoo.py --action remove
zamiast tego po prostufoo.py install
parser.add_argument('install', help='Install the app')
(Zauważ, że nie możesz zdefiniować argumentu pozycyjnego za pomocąrequired=True
)args
wygenerowano ten dykt, jak powyżej.args.foo
iargs.bar
zamiast składni słownika. Oba sposoby są oczywiście w porządku, ale args nie jest tak naprawdę słownikiem, aleargparse.Namespace
obiektem.argparse
Dokumentacja jest dość dobre, ale pomija kilka przydatnych informacji, które mogą nie być oczywiste. (@Diego Navarro już o tym wspomniał, ale postaram się nieco rozwinąć jego odpowiedź). Podstawowe użycie jest następujące:Obiekt, z którego wracasz,
parse_args()
to obiekt „Przestrzeń nazw”: Obiekt, którego zmienne składowe są nazwane na podstawie argumentów wiersza poleceń.Namespace
Celem jest jak masz dostęp do swoich argumentów i wartości związanych z nimi:(Zauważ, że
argparse
zastępuje „-” w nazwach argumentów podkreśleniami podczas nazywania zmiennych).W wielu sytuacjach możesz chcieć użyć argumentów po prostu jako flag, które nie przyjmują żadnej wartości. Możesz dodać te w argparse w następujący sposób:
Powyższe spowoduje utworzenie zmiennych o nazwach odpowiednio „foo” o wartości True i „no_foo” o wartości False:
Pamiętaj również, że możesz dodać opcję „wymagane” podczas dodawania argumentu:
W ten sposób, jeśli pominiesz ten argument w wierszu poleceń
argparse
, powie ci, że go brakuje i zatrzymasz wykonywanie skryptu.Na koniec zauważ, że możliwe jest stworzenie struktury dyktowania twoich argumentów za pomocą
vars
funkcji, jeśli to ułatwi ci życie.Jak widać,
vars
zwraca dykton z nazwami argumentów jako kluczami i ich wartościami jako, er, wartości.Istnieje wiele innych opcji i rzeczy, które możesz zrobić, ale powinno to obejmować najważniejsze, najczęstsze scenariusze użycia.
źródło
'-f'
i'-b'
? Dlaczego nie możesz tego pominąć?man cp
lubman ls
przekonasz się, że wiele opcji występuje w obu smakach (np-f, --force
.). Prawdopodobnie istnieją bardzo różne powody, dla których ludzie wolą jedno lub drugie, ale w każdym razie dość standardowe jest udostępnianie obu formularzy w twoim programie.Matt pyta o parametry pozycyjne w argparse i zgadzam się, że brakuje dokumentacji Pythona w tym aspekcie. Nie ma jednego kompletnego przykładu na nieparzystych stronach ~ 20, które pokazują zarówno analizę, jak i użycie parametrów pozycyjnych .
Żadna z pozostałych odpowiedzi tutaj nie pokazuje pełnego przykładu parametrów pozycyjnych, więc oto kompletny przykład:
Rzeczą, która mnie odrzuciła, jest to, że argparse przekształci nazwany argument „--foo-bar” na „foo_bar”, ale parametr pozycyjny o nazwie „foo-bar” pozostanie jako „foo-bar”, dzięki czemu mniej oczywiste jest, jak użyj go w swoim programie.
Zwróć uwagę na dwie linie na końcu mojego przykładu - żaden z nich nie będzie działał, aby uzyskać wartość parametru pozycyjnego foo-bar. Pierwszy jest oczywiście błędny (jest to wyrażenie arytmetyczne args.foo minus pasek), ale drugi też nie działa:
Jeśli chcesz użyć tego
foo-bar
atrybutu, musisz go użyćgetattr
, jak widać w ostatnim wierszu mojego przykładu. Dziwne jest to, że jeśli spróbujeszdest=foo_bar
zmienić nazwę właściwości na coś, co jest łatwiej dostępne, otrzymasz naprawdę dziwny komunikat o błędzie:Oto jak działa powyższy przykład:
źródło
nargs='?'
Jest to zaklęcie dla „opcjonalnym pozycyjnych” zgodnie stackoverflow.com/questions/4480075/...foo-bar
nie jest przekształcana,foo_bar
jest opisany w bugs.python.org/issue15125 .print args.foo_bar
działa. Ponieważ jest to argument pozycyjny, nie musisz określać nazwy podczas wywoływania skryptu, więc nie ma to znaczenia dla użytkownika.getattr
(jest również bardziej elastyczna, ponieważ umożliwia zmianę argumentu z opcjonalnego na pozycyjny bez konieczności zmiany kodu, który używa wartości).Jeszcze jedno wprowadzenie podsumowujące, zainspirowane tym postem .
Argumenty są definiowane za pomocą kombinacji następujących elementów:
Typowe opcje to:
--help
jest używany.float
lubint
(inaczej jeststr
).'-x', '--long-name', dest='longName'
.).Uwaga: domyślnie
--long-name
można uzyskać dostęp za pomocąargs.long_name
store_true, store_false
: dla argumentów logicznych'--foo', action='store_true' => args.foo == True
store_const
: do użycia z opcjąconst
'--foo', action='store_const', const=42 => args.foo == 42
count
: dla powtarzających się opcji, jak w./myscript.py -vv
'-v', action='count' => args.v == 2
append
: dla powtarzających się opcji, jak w./myscript.py --foo 1 --foo 2
'--foo', action='append' => args.foo == ['1', '2']
./myscript.py --foo a b => args.foo = ['a', 'b']
type=int
).źródło
Zwróć uwagę na samouczek Argparse w Pythonie HOWTO . Zaczyna się od najbardziej podstawowych przykładów, takich jak ten:
i przechodzi do mniej podstawowych.
Istnieje przykład z predefiniowanym wyborem opcji, na przykład pytanie:
źródło
Oto, co wymyśliłem w moim projekcie edukacyjnym, głównie dzięki @DMH ...
Kod demonstracyjny:
To mogło ewoluować i jest dostępne online: command-line.py
Skrypt do ćwiczenia tego kodu: Command-line-demo.sh
źródło
Możesz także użyć plac (otoki wokół
argparse
).Jako bonus generuje dokładne instrukcje pomocy - patrz poniżej.
Przykładowy skrypt:
Przykładowe dane wyjściowe:
Nie podano argumentów -
example.py
:Podano nieoczekiwany argument -
example.py C
:Podano poprawny argument -
example.py A
:Pełne menu pomocy (generowane automatycznie) -
example.py -h
:Krótkie wyjaśnienie:
Nazwa argumentu zwykle jest równa nazwie parametru (
arg
).Adnotacja krotkowa po
arg
parametrze ma następujące znaczenie:Argument with two possible values
)positional
)None
)None
)['A', 'B']
)Dokumentacja:
Aby dowiedzieć się więcej o korzystaniu z plac, sprawdź jego świetną dokumentację:
źródło
Aby dodać do tego, co stwierdzili inni:
Zwykle lubię używać parametru „dest”, aby określić nazwę zmiennej, a następnie użyć „globals (). Update ()”, aby umieścić te zmienne w globalnej przestrzeni nazw.
Stosowanie:
Kod:
źródło
argparse
Używa wewnętrzniegetattr
isetattr
do uzyskiwania dostępu do wartości w przestrzeni nazw. W ten sposób nie przeszkadzają mu dziwnie sformułowanedest
wartości.Naprawdę prostym sposobem użycia argparse i zmiany przełączników „-h” / „--help” w celu wyświetlenia własnych instrukcji pomocy dla kodu osobistego jest ustawienie domyślnej pomocy na False, można również dodać tyle dodatkowych .add_arguments, ile chcesz :
Uruchom: python test.py -h
Wynik:
źródło
Najprostsza odpowiedź!
PS, ten, który napisał dokument o argparse, jest głupi
kod python:
uruchomiony kod
źródło