В python, как получить подпарамеры для чтения в аргументе родительского парсера?

Вот пример кода:

import argparse

parser=argparse.ArgumentParser()
parser.add_argument('-main_arg')
subparser=parser.add_subparser()
a=subparser.add_parser('run')
a.add_argument('required_sub_arg')
a.add_argument('arg_a')
b=subparser.add_parser('b')
parser.parse_args()

Я хочу, чтобы он читал в -main_arg, если я введу program run required_sub_arg -main_arg -arg_a

В настоящее время он не распознает -main_arg как допустимый аргумент.

Ответ 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.