Позиционный аргумент для подпараметра вызывает ошибку: неверный выбор

#python #parsing #command-line-arguments #argparse

Вопрос:

Я новичок, поэтому, возможно, это ошибка новичка, поэтому, пожалуйста, поделитесь со мной. argsparse Мой код:

 import argsparse

parent_parser = argparse.ArgumentParser(description='Argument Parser')
subparsers = parent_parser.add_subparsers(title="Sub-commands", description='Sub-commands Parser')
parser_create = subparsers.add_parser('run', parents=[parent_parser], add_help=False, help="run the program")
parser_create.add_argument('--program', metavar=('NAME'), required=True, type=str, help='name of the program')
 

Это прекрасно работает при запуске parser.py run --program 'test' в консоли:

args = parent_parser.parse_args(); print(args) выходы Namespace(program='test')

Однако, когда я пытаюсь заменить необязательный аргумент позиционным, например:

 parser_create.add_argument('program', metavar=('NAME'), type=str, help='name of the program')
 

А затем запустите parser.py run 'test' в консоли следующую ошибку:

 usage: parser.py run [-h] {run} ... NAME
parser.py run: error: invalid choice: 'test' (choose from 'run')
 

Добавление позиционного аргумента в группу приводит к той же ошибке, что и выше:

 required = parser_create.add_argument_group('required positional argument')
required.add_argument('program', metavar=('NAME'), type=str, help='name of the program')
 

Как я могу передать позиционные аргументы в подраздел, отформатированный как run <program> ?

Я был бы признателен за любую обратную связь. Спасибо!

Комментарии:

1. docs.python.org/3/library/…

Ответ №1:

Спасибо @PhilippSelenium за указание ссылки на документы.

Я решил эту проблему, удалив parents=[parent_parser] из subparsers.add_parser()

Комментарии:

1. с помощью родителей был создан своего рода рекурсивный механизм подзапроса, ожидающий prog.py run run run ...