У меня есть скрипт Python, который принимает необязательный позиционный аргумент и имеет несколько подкоманд. Некоторым из этих подкоманд требуется позиционный аргумент, некоторым — нет. Проблема у меня возникает, когда я пытаюсь использовать подкоманду, которая не требует позиционного аргумента. Рассмотрим следующий тестовый файл:
import argparse
argp = argparse.ArgumentParser()
argp.add_argument('inputfile', type=str, nargs='?',
help='input file to process')
argp.add_argument('--main_opt1', type=str,
help='global option')
subp = argp.add_subparsers(title='subcommands',
dest='parser_name',
help='additional help',
metavar="<command>")
tmpp = subp.add_parser('command1', help='command1 help')
tmpp.add_argument('pos_arg1', type=str,
help='positional argument')
print repr(argp.parse_args())
Когда я пытаюсь использовать подкоманду command1
с первым аргументом, все идет хорошо.
macbook-pro:~ jmlopez$ python pytest.py filename command1 otherarg
Namespace(inputfile='filename', main_opt1=None, parser_name='command1', pos_arg1='otherarg')
Но теперь предположим, что command1
не нуждается в первом позиционном аргументе.
macbook-pro:~ jmlopez$ python pytest.py command1 otherarg
usage: pytest.py [-h] [--main_opt1 MAIN_OPT1] [inputfile] <command> ...
pytest.py: error: argument <command>: invalid choice: 'otherarg' (choose from 'command1')
Я почему-то ожидал, что inputfile
будет установлено на None
. Есть ли способ, которым argparse
может предсказать, что command1
на самом деле является подкомандой и, следовательно, inputfile
должно быть установлено в None?