Что мне нужно:
pro [-a xxx | [-b yyy -c zzz]]
Я пробовал это, но не работает. Может ли кто-нибудь мне помочь?
group= parser.add_argument_group('Model 2')
group_ex = group.add_mutually_exclusive_group()
group_ex.add_argument("-a", type=str, action = "store", default = "", help="test")
group_ex_2 = group_ex.add_argument_group("option 2")
group_ex_2.add_argument("-b", type=str, action = "store", default = "", help="test")
group_ex_2.add_argument("-c", type=str, action = "store", default = "", help="test")
Благодарность!
Ответы:
add_mutually_exclusive_group
не делает всю группу взаимоисключающей. Это делает варианты внутри группы взаимоисключающими.Вам нужны подкоманды . Вместо проги [-a xxxx | [-b yyy -c zzz]], у вас будет:
prog command 1 -a: ... command 2 -b: ... -c: ...
Чтобы вызвать с первым набором аргументов:
Чтобы вызвать со вторым набором аргументов:
Вы также можете установить аргументы подкоманды как позиционные.
Что-то вроде git или svn:
Рабочий пример
# create the top-level parser parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('--foo', action='store_true', help='help for foo arg.') subparsers = parser.add_subparsers(help='help for subcommand') # create the parser for the "command_1" command parser_a = subparsers.add_parser('command_1', help='command_1 help') parser_a.add_argument('a', type=str, help='help for bar, positional') # create the parser for the "command_2" command parser_b = subparsers.add_parser('command_2', help='help for command_2') parser_b.add_argument('-b', type=str, help='help for b') parser_b.add_argument('-c', type=str, action='store', default='', help='test')
Попробуй это
>>> parser.print_help() usage: PROG [-h] [--foo] {command_1,command_2} ... positional arguments: {command_1,command_2} help for subcommand command_1 command_1 help command_2 help for command_2 optional arguments: -h, --help show this help message and exit --foo help for foo arg. >>> >>> parser.parse_args(['command_1', 'working']) Namespace(a='working', foo=False) >>> parser.parse_args(['command_1', 'wellness', '-b x']) usage: PROG [-h] [--foo] {command_1,command_2} ... PROG: error: unrecognized arguments: -b x
Удачи.
источник
[[-a <val>] | [-b <val1> -c <val2>]]
[-a xxx | [-b yyy -c zzz]]
Хотя ответ Джонатана отлично подходит для сложных вариантов, существует очень простое решение, которое будет работать для простых случаев, например, 1 вариант исключает 2 других варианта, например, в
или даже как в исходном вопросе:
Вот как бы я это сделал:
parser = argparse.ArgumentParser() # group 1 parser.add_argument("-q", "--query", help="query", required=False) parser.add_argument("-f", "--fields", help="field names", required=False) # group 2 parser.add_argument("-a", "--aggregation", help="aggregation", required=False)
Я использую здесь параметры, данные оболочке командной строки для запроса mongodb.
collection
Экземпляр может либо вызвать методaggregate
или методfind
с для дополнительных аргументовquery
иfields
, следовательно , вы видите , почему первые два аргумента является совместимым и последним не является.Итак, теперь я бегу
parser.parse_args()
и проверяю его содержимое:args = parser().parse_args() print args.aggregation if args.aggregation and (args.query or args.fields): print "-a and -q|-f are mutually exclusive ..." sys.exit(2)
Конечно, этот небольшой прием работает только в простых случаях, и было бы кошмаром проверять все возможные варианты, если у вас есть много взаимоисключающих вариантов и групп. В этом случае вам следует разбить свои параметры на группы команд, как предложил Джонатан.
источник
parser.error("-a and -q ...")
. Таким образом, полная справка по использованию будет распечатана автоматически.q
иf
требуются в первой группе - это пользователь, (2) требуется любая из групп. И это делает «простое» решение уже не таким простым. Так что я согласен, что это скорее взлом для написанного вручную сценария, но не реальное решениеСуществует патч для Python (в разработке), который позволит вам это сделать.
http://bugs.python.org/issue10984
Идея состоит в том, чтобы разрешить перекрывающиеся взаимоисключающие группы. Так
usage
может выглядеть:Изменение кода argparse таким образом, чтобы вы могли создать две группы, как это, было несложной частью. Для изменения
usage
кода форматирования потребовалось написать собственныйHelpFormatter
.В
argparse
, группы действий не влияют на синтаксический анализ. Они всего лишьhelp
инструмент форматирования. Воhelp
взаимоисключающих группах влияет только наusage
строку. При синтаксическом анализеparser
использует взаимоисключающие группы для создания словаря потенциальных конфликтов (a
не может возникнутьb
илиc
,b
не может возникнутьa
и т.д.), а затем выдает ошибку, если возникает конфликт.Без этого argparse патча, я думаю , ваш лучший выбор , чтобы проверить пространство имен произведенных
parse_args
самостоятельно (например , если обаa
иb
имеют нестандартные значения), а также повысить свою собственную ошибку. Вы даже можете использовать собственный механизм ошибок парсера.parser.error('custom error message')
источник