2013-06-12 17 views
27

Przeszukałem wiele różnych przykładów tutaj i ogólnie, ale nie wydaje mi się, aby odkryć tę pozornie prostą rzecz.Jak poprawnie używać argparse paragraphs?

Mam dwa typy var, z których jeden ma ograniczenia, tak więc piskliwy był do zrobienia. na przykład -t pozwala na "A" lub "B". Jeśli użytkownik przekaże "A", wówczas będzie musiał dodatkowo określić, czy jest to "a1", czy "a2". Jeśli przejdą tylko "B", to nic.

Czy mogę to zrobić i czy argparse zwróci mi rodzaj "A" lub czy jest to "B"?

Poniższe wydaje się działać, ale z jakiegoś powodu przerwy, gdy przechodzi cokolwiek po akapicie.

np. z terminalu linux

>> python test01.py -t A a1 -v 61 

błędy z ...

usage: test01.py a1 [-h] 
test01.py a1: error: unrecognized arguments: -v 

Mam nadzieję, że to ma sens.

Kod:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 

parser.add_argument("-t", 
        choices = ["A", "B"], 
        dest = "type", 
        required=True, 
        action='store', 
        help="Some help blah blah") 

cam_parser = subparsers.add_parser('a1', help='Default') 
cam_parser.set_defaults(which='a1') 

cam_parser = subparsers.add_parser('a2', help='parse this instead of default') 
cam_parser.set_defaults(which='a2') 


parser.add_argument("-v", 
        nargs = '+', 
        required=True, 
        dest = "version", 
        type=int, 
        action='store', 
        help="some version help blah blah") 

argument = parser.parse_args() 

print argument.type 
print argument.version 

Odpowiedz

26

Subparsers są wywoływane na podstawie wartości pierwszej pozycyjnej argumentu, więc rozmowa będzie wyglądać

python test01.py A a1 -v 61 

"A" powoduje odpowiednią subparser , który zostałby zdefiniowany w celu umożliwienia argumentu pozycyjnego i opcji -v.

Ponieważ argparse żaden sposób nie nakłada żadnych ograniczeń w kolejności, w której mogą pojawić się argumenty i opcje, a nie ma w prosty sposób modyfikować, jakie argumenty/opcje może pojawiają się raz parsowania rozpoczął (coś udziałem niestandardowe działania, które modyfikują instancja parser może pracować), należy rozważyć zastąpienie -t sam:

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(help='types of A') 
parser.add_argument("-v", ...) 

a_parser = subparsers.add_parser("A") 
b_parser = subparsers.add_parser("B") 

a_parser.add_argument("something", choices=['a1', 'a2']) 

Od -v jest zdefiniowany dla głównego parsera, musi być określony przed argument, który określa, które subparser jest używany dla pozostanie argumenty.

+1

Wielkie dzięki bardzo. Jednak nadal otrzymywałem błąd, gdy minąłem -v z jakiegoś powodu, tj. Oczekiwałem -v, a kiedy przekazałem, dostałem stary błąd "nierozpoznane argumenty". Nawet jeśli przekazałem go przed argumentami pozycyjnymi. Jakieś pomysły? Próbowałem znaleźć podobny przykład, ale nie miałem szczęścia. – user1571144

+0

jest "przed argumentem, który określa, który z poziomów" odnosi się do kodu użytkownika wprowadzającego argument lub do obu? – Nickpick

+0

Wygląda na to, że wykonywanie 'group1 = parser.add_subparsers (help = 'grupa -1')' i 'group2 = parser.add_subparsers (help = 'grupa 2") 'daje' błąd: nie może mieć wielu błędów argumentów'. Miałem nadzieję, że użyję go do grupowania podpoleceń. –