Я добавляю подпарамеры к своему парсеру для имитации функциональных возможностей подкоманд (например, код см.: Simple command line application in python - parse user input?). Теперь я хочу добавить команду subparser/command quit
, которая не принимает аргументов и имеет действие «выйти». Является ли это возможным ? Как я могу это сделать?python argparse - добавить действие в subparser без аргументов?
11
A
ответ
13
В документации для subcommands
приведены два примера определения подпараметра.
https://docs.python.org/dev/library/argparse.html#sub-commands
Один, чтобы дать add_subparsers
dest
:
def do_quit(args):
# action
quit()
parser = ArgumentParser()
subparser = parser.add_subparsers(dest='cmd')
....
subparser.add_parser('quit')
...
args = parser.parse_args()
print args.cmd # displays 'quit'
if args.cmd == 'quit':
do_quit(args)
другой использовать set_defaults
связать subparser с функцией:
parser = ArgumentParser()
subparsers = parser.add_subparsers()
...
parser_quit = subparsers.add_parser('quit')
parser_quit.set_defaults(func=do_quit)
...
args = parser.parse_args()
args.func(args)
On дальнейшая мысль, вот путь, используя обычай Action
. Это как _HelpAction
(который используется -h
). Он вызывается позиционным аргументом с nargs=0
(или '?'). Такой аргумент всегда называется, хотя нет никаких строк для его соответствия (вернее, 0 строк соответствуют ему). Это логичное, но несколько неясное следствие того, как обрабатываются позиционные элементы.
class QuitAction(argparse.Action):
def __call__(self, parser, *args, **kwargs):
parser.exit(message="QUITTING\n")
p=argparse.ArgumentParser()
sp=p.add_subparsers(dest='cmd')
p1=sp.add_parser('quit')
p1.add_argument('foo', action=QuitAction, nargs='?', help=argparse.SUPPRESS)
p.parse_args(['quit'])
производства (при запуске в IPython):
QUITTING
An exception has occurred, use %tb to see the full traceback.
SystemExit: 0
Смежные вопросы
- 1. Группировка аргументов subparser argparse
- 2. argparse опционально subparser (для --version)
- 3. argparse subparser monolithic help output
- 4. Python argparse: получить имя программы subparser в строке справки
- 5. Python: как иметь взаимоисключающие группы в subparser с помощью argparse?
- 6. Захват аргументов в argparse python
- 7. Python: argparse необязательных аргументов без дефисов
- 8. Argparse - Пользовательское действие без аргумента?
- 9. Python argparse зависимость аргументов
- 10. Как изменить формат subparser с argparse
- 11. Создание скрытых аргументов с помощью Python argparse
- 12. Python argparse: Слишком мало аргументов
- 13. метод вызова без аргументов из argparse
- 14. Подпарамеры подпрограммы Python argparse
- 15. python argparse - пропустить список для argparse без командной строки
- 16. Python subparser разбор с nargs = '+'
- 17. Поддерживает ли argparse (python) взаимоисключающие группы аргументов?
- 18. Остановить парсинг после subparser
- 19. Распаковка аргументов из argparse
- 20. Python: порядок отображения входных аргументов с argparse
- 21. Python argparse & Unix piping для аргументов
- 22. Python; argparse; как указать позицию позиционных аргументов
- 23. аргументов необязательных ключевого слова - argparse
- 24. Список аргументов с argparse
- 25. argparse зависимость аргументов
- 26. Python argparse - создание подкоманд без ярлыков
- 27. Разрешение определенных аргументов Argparse
- 28. Python sys.argv и argparse
- 29. Python использование argparse модуля
- 30. Добавить аргументы в argparse в зависимости от значения начальных аргументов
Спасибо! Если вы посмотрите на связанный код: http://stackoverflow.com/questions/25332925/simple-command-line-application-in-python-parse-user-input/25368374#25368374, вы увидите, что я хочу разбор происходит автоматически - я не хочу добавлять логику вне парсера. Другого пути нет ? Могу ли я добавить аргумент «выйти» в основной синтаксический анализатор (без '-quit')? edit: [github] (https://github.com/Utumno/psync/blob/master/watcher/cli.py) –
Sure - подкласс ArgumentParser, который переопределяет 'parse_args'. Сначала нужно было бы вызвать super(). Parse_args' (или 'parse_known_args'), а затем выполнить« логику вне парсера ». Только вы точно знаете, что скрывается за этим определением метода. – hpaulj
Я добавил метод, используя необязательный пост-аргумент. – hpaulj