Ta odpowiedź pochodzi od Stevena Betharda w grupach Google . Przekazuję go tutaj, aby ułatwić dostęp osobom nieposiadającym konta Google.
Możesz zastąpić domyślne zachowanie error
metody:
import argparse
import sys
class MyParser(argparse.ArgumentParser):
def error(self, message):
sys.stderr.write('error: %s\n' % message)
self.print_help()
sys.exit(2)
parser = MyParser()
parser.add_argument('foo', nargs='+')
args = parser.parse_args()
Zauważ, że powyższe rozwiązanie wydrukuje komunikat pomocy za każdym razem, gdy error
zostanie wyzwolona metoda. Na przykład test.py --blah
wydrukuje komunikat pomocy, jeśli --blah
nie jest prawidłową opcją.
Jeśli chcesz wydrukować komunikat pomocy tylko wtedy, gdy w wierszu poleceń nie podano argumentów, być może jest to najłatwiejszy sposób:
import argparse
import sys
parser=argparse.ArgumentParser()
parser.add_argument('foo', nargs='+')
if len(sys.argv)==1:
parser.print_help(sys.stderr)
sys.exit(1)
args=parser.parse_args()
Zauważ, że parser.print_help()
domyślnie drukuje na standardowym wyjściu. Jak sugeruje init_js , użyj parser.print_help(sys.stderr)
do drukowania na stderr.
parser.print_usage()
zamiastparser.print_help()
- komunikat pomocy zawiera użycie, ale jest bardziej szczegółowe.error()
wydaje mi się okropnym pomysłem. Służy innym celom, nie jest przeznaczony do drukowania przyjaznego użytkowania lub pomocy.Zamiast pisać klasę można zamiast tego użyć try / wyjątek
Zaletą jest to, że przepływ pracy jest bardziej przejrzysty i nie potrzebujesz klasy kodu pośredniczącego. Minusem jest to, że pierwsza linia „użytkowania” jest drukowana dwukrotnie.
Będzie to wymagało co najmniej jednego obowiązkowego argumentu. Bez obowiązkowych argumentów podanie zerowych argumentów w wierszu poleceń jest poprawne.
źródło
-h
flaga jest używana, a niepotrzebne wypisuje pomoc, jeśli--version
flaga jest używana. Aby złagodzić te problemy, możesz sprawdzić typ błędu w następujący sposób:except SystemExit as err: if err.code == 2: parser.print_help()
Za pomocą argparse możesz zrobić:
źródło
parser.parse_args()
Jeśli masz argumenty, które należy podać, aby skrypt mógł zostać uruchomiony - użyj wymaganego parametru ArgumentParser, jak pokazano poniżej: -
parse_args () zgłosi błąd, jeśli skrypt zostanie uruchomiony bez żadnych argumentów.
źródło
Jeśli skojarzysz funkcje domyślne dla parserów (pod), jak wspomniano poniżej
add_subparsers
, możesz po prostu dodać je jako akcję domyślną:Dodaj try-wyjątkiem, jeśli zgłaszane są wyjątki z powodu braku argumentów pozycyjnych.
źródło
Najczystszym rozwiązaniem będzie ręczne przekazanie domyślnego argumentu, jeśli nie podano żadnego w wierszu poleceń:
Kompletny przykład:
Spowoduje to wydrukowanie pełnej pomocy (nie krótkiego użycia), jeśli zostanie wywołany bez argumentów.
źródło
sys.argv[1:]
jest bardzo powszechnym idiomem. Widzęparser.parse_args(None if sys.argv[1:] else ['-h'])
więcej idiomatycznych i czystszych.Wrzucam tutaj moją wersję na stos:
Możesz zauważyć
parser.exit
- robię to głównie dlatego, że zapisuje wiersz importu, jeśli był to jedyny powódsys
w pliku ...źródło
not vars(args)
może nie działać, gdy argumenty majądefault
metodę.Istnieje para jednowierszowych znaków z
sys.argv[1:]
(bardzo powszechnym idiomem Pythona, który odnosi się do argumentów wiersza poleceń, jestsys.argv[0]
nazwą skryptu), które mogą wykonać to zadanie.Pierwszy z nich jest zrozumiały, czysty i pytoniczny:
Drugi jest trochę trudniejszy. Łącząc wcześniej oceniany fakt, że pusta lista jest
False
z odpowiednikamiTrue == 1
iFalse == 0
otrzymujesz to:Może za dużo nawiasów, ale całkiem jasne, czy dokonano wcześniejszego wyboru argumentu.
źródło
parser.exit
Sposób akceptować równieżstatus
(returnCode) orazmessage
wartość (m.in. tylnego przełamane siebie!).uparty przykład :)
Przykładowe wywołania:
źródło
Ustaw argumenty pozycyjne za pomocą nargs i sprawdź, czy argumenty pozycyjne są puste.
Odwołanie Nargs Python
źródło
Oto inny sposób, aby to zrobić, jeśli potrzebujesz czegoś elastycznego, w którym chcesz wyświetlić pomoc, jeśli określone parametry zostaną przekazane, żaden lub więcej niż jeden sprzeczny argument:
Twoje zdrowie!
źródło
Jeśli twoje polecenie jest czymś, w którym użytkownik musi wybrać jakąś akcję, użyj grupy wzajemnie się wykluczającej z wymaganym = Prawda .
Jest to rodzaj rozszerzenia odpowiedzi udzielonej przez pd321.
Wynik:
To tylko podstawowa pomoc. A niektóre inne odpowiedzi dadzą ci pełną pomoc. Ale przynajmniej użytkownicy wiedzą, że mogą zrobić -h
źródło
Nie jest to dobre (ponieważ przechwytuje wszystkie błędy), ale:
Oto definicja
error
funkcjiArgumentParser
klasy:https://github.com/python/cpython/blob/276eb67c29d05a93fbc22eea5470282e73700d20/Lib/argparse.py#L2374
. Jak widać, po podpisie potrzeba dwóch argumentów. Jednak funkcje poza klasą nic nie wiedzą o pierwszym argumencie:
self
ponieważ, z grubsza mówiąc, jest to parametr dla klasy. (Wiem, że wiesz ...) W ten sposób, po prostu przekazać własneself
imessage
na_error(...)
nie może (wyświetli:
). Można przekazać
parser
(self
) w_error
funkcji, nazywając go:, ale nie chcesz teraz wychodzić z programu. Następnie zwróć:
. Niemniej jednak
parser
nie wie, że został zmodyfikowany, więc gdy wystąpi błąd, wyśle przyczynę (przy okazji, jego zlokalizowane tłumaczenie). Więc przechwyć to:. Teraz, gdy wystąpi błąd i
parser
wyśle przyczynę, przechwycisz go, popatrzysz na to i ... wyrzucisz.źródło