2016-12-09 2 views
1

У меня есть код:Необязательный аргумент после subparsers в argparse

parser = ArgumentParser() 
parser.add_argument('--verbose', action='count', default=0, help='debug output') 
subparsers = parser.add_subparsers(help='subparser') 
parser1 = subparsers.add_parser('action', help='Do something') 
parser1.add_argument('--start', action='store_true', help='start') 
parser1.add_argument('--stop', action='store_true', help='stop') 
parser2 = subparsers.add_parser('control', help='Control something') 
parser2.add_argument('--input', action='store_true', help='start') 
parser2.add_argument('--output', action='store_true', help='stop') 
args = parser.parse_args() 

Тогда я могу запустить скрипт:

script.py --verbose действие --start

script.py - -вербоборудование - выход

но не

script.py действие --start --verbose

контроль script.py --output --verbose

Могу ли я передать опцию --verbose до конца, без добавления его в каждая группа?

+0

Считаете ли вы использование библиотеки обертки, такой как [argh] (https://pypi.python.org/pypi/argh)? – Gribouillis

+0

Я бы не хотел – deniska369

+0

Я бы дал окончательный 'no', за исключением того, что я не могу запускать тесты или проверять код из этого планшета. По-моему, я мог бы с' qpython', но было бы болью вводить все. объяснение заключается в том, как синтаксический разбор передается субпаратору. – hpaulj

ответ

2

Выработать на мой комментарий:

argparse анализирует список ввода (sys.argv [1:]) в порядке, соответствующие строки с Actions (add_argument объект). Таким образом, если команда

python foo.py --arg1=3 cmd --arg2=4 

он пытается справиться с '--arg1', затем 'CMD'. Если «cmd» соответствует имени подпарамера, он затем делегирует синтаксический разбор синтаксическому парсеру, передавая ему остальные строки. Если подпараметр cmd может обрабатывать --arg2, он возвращает это как аргумент unrecognized.

Главный синтаксический анализатор не возобновляет разбор. Скорее, он просто обрабатывает аргументы unrecognized, как обычно, - повышение ошибки при использовании parse_args и возврат их в список extras, если используется parse_known_args.

Итак, если вы хотите положить --verbose в конец, вы определяете его как аргумент подпараметра. Или выполните дальнейший синтаксический анализ после parse_known_args.

Вы можете определить --verbose на обоих уровнях, хотя иногда такое определение может создавать конфликты (особенно если значения по умолчанию отличаются).

Механизм parents может использоваться для уменьшения количества ввода, хотя вы можете так же легко написать свои собственные служебные функции.