Как да използвам правилно подпарсерите на argparse?

Търсих в много от примерите за подпарсер тук и като цяло, но не мога да разбера това на пръв поглед просто нещо.

Имам два типа var, единият от които има ограничения, така че реших, че subparser е правилният начин. напр. -t позволява или A, или B. Ако потребителят премине A, тогава от него се изисква също да посочи дали е a1 или a2. Ако преминат само B, тогава нищо.

Мога ли да направя това и argparse да ми върне какъв тип A е предаден или дали е бил само B?

Изглежда, че по-долу работи, но по някаква причина се прекъсва при предаване на нещо след подразбора.

напр. от линукс терминал

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

грешки с...

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

Надяваме се, че има смисъл.

Кодът:

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

person user1571144    schedule 12.06.2013    source източник


Отговори (1)


Подпарсерите се извикват въз основа на стойността на първия позиционен аргумент, така че извикването ви ще изглежда така

python test01.py A a1 -v 61

„A“ задейства подходящия поданализатор, който ще бъде дефиниран да позволява позиционен аргумент и опцията -v.

Тъй като argparse иначе не налага никакви ограничения върху реда, в който аргументите и опциите могат да се появяват, и няма лесен начин да промените какви аргументи/опции могат да се показват, след като анализът е започнал (нещо, включващо персонализирани действия, които модифицирането на екземпляра на анализатора може да работи), трябва да обмислите замяната на самия -t:

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'])

Тъй като -v е дефиниран за главния анализатор, той трябва да бъде указан преди аргумента, който указва кой поданализатор се използва за останалите аргументи.

person chepner    schedule 12.06.2013
comment
страхотно благодаря много. Въпреки това все още получавах грешка, когато подадох -v по някаква причина, т.е. очакваше -v и когато го предадох, получих старите си неразпознати аргументи за грешка. Дори и да го премина преди позиционните аргументи. Някакви идеи? Опитвах се да намеря подобен пример, но нямах много късмет. - person user1571144; 18.06.2013
comment
дали before the argument that specifies which subparser се отнася до кода на потребителя, който въвежда аргумента, или и двете? - person Nickpick; 20.06.2017
comment
Изглежда, че изпълнението на group1 = parser.add_subparsers(help='subparser group 1') и group2 = parser.add_subparsers(help='subparser group 2') дава error:cannot have multiple subparser arguments грешка. Надявах се да го използвам за групиране на подкоманди. - person Minh Tran; 12.02.2018
comment
@MinhTran Ще трябва да използвате a_parser.add_subparsers() и b_parser.add_subparsers() в този случай. - person chepner; 12.02.2018