Ответ 1
Сообщение службы для последних читателей
Поскольку этот вопрос все еще посещает в 2016 году, прежде чем делать что-либо из этого комплекса с argparse, рассмотрите вместо этого docopt. Это улучшит как ваше здравомыслие, так и все, кто может читать или модифицировать ваш код. Спасибо.
Оригинальный ответ
Как есть, у вас есть несколько проблем.
Во-первых, parser.parse_args
- это метод, который возвращает пространство имен аргументов parser
, поэтому вы должны сделать что-то вроде
args = parser.parse_args()
Затем args.main_args
, чтобы получить -main_arg
от вызова типа
program -main_arg run required_sub_arg -arg_a
Ваша проблема с main_arg
заключается в том, что вы создали аргумент parser
с именем main_arg
, и вы вызываете вызов, например
program run required_sub_arg -main_arg -arg_a
который ссылается на аргумент a
с именем main_arg
. Поскольку a
не имеет такого аргумента, он недействителен.
Чтобы обратиться к аргументу парсера из одного из его подпараметров, вы должны заставить указанный субпараметр наследовать аргументы своего родителя. Это делается с помощью
a=parser.add_subparser('run', parents=[parser])
Вы ошиблись подпарщиком для детского парсера. Для получения дополнительной информации см. http://docs.python.org/dev/py3k/library/argparse.html и https://code.google.com/p/argparse/issues/detail?id=54.