Для всех, кто использует argparse, который прибывает сюда, ищет способ отображения «общих» аргументов подпарасера на «главном» экране справки, вот один из подходов:
import argparse
common = argparse.ArgumentParser(add_help=False)
common.add_argument('--shared', action='store_true', help='some shared arg')
parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('--parent', action='store_true', help='parent only arg')
subparsers = parser.add_subparsers()
run = subparsers.add_parser('run', parents=[common])
run.add_argument('--fast', action='store_true', help='run only arg')
parser.epilog = "--- Arguments common to all sub-parsers ---" \
+ common.format_help().replace(common.format_usage(), '')
args = parser.parse_args()
Основная помощь:
$ program.py -h
usage: program.py [-h] {run} ...
positional arguments:
{run}
optional arguments:
-h, --help show this help message and exit
--parent parent only arg
--- Arguments common to all sub-parsers ---
optional arguments:
--shared some shared arg
run
Справка подпарсера:
$ program.py run -h
usage: program.py run [-h] [--shared]
optional arguments:
-h, --help show this help message and exit
--shared some shared arg
--fast run only arg
Чтобы ответить на актуальный вопрос, поскольку принятый ответ не работает для меня, вот дополнительная информация о том, почемуКажется невозможным по-настоящему совместно использовать аргументы argparse с одинаковыми именами как для родительского, так и для дочернего / субпарсера.
Во-первых, проблема со следующим кодом:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-main_arg')
subparsers = parser.add_subparsers()
run = subparsers.add_parser('run', parents=[parser])
args = parser.parse_args()
Это приводит к следующей ошибке, так как родительский элемент parser
и подпарсер run
определяют аргумент -h / - help (по умолчанию).
Argparse.ArgumentError: argument -h/--help: conflicting option strings: -h, --help
Хотя эта ошибка может бытьизбегать путем подавления опции -h / - help (с add_help=False
) на родительском или дочернем элементе, хорошо иметь опцию help на обоих уровнях.
Еще один потенциальный способ избежать конфликтующих опций помощидолжен двигаться общий аргументы для общего парсера, common
:
import argparse
common = argparse.ArgumentParser(add_help=False)
common.add_argument('-main_arg', action='store_true')
parser = argparse.ArgumentParser(parents=[common])
subparsers = parser.add_subparsers()
run = subparsers.add_parser('run', parents=[common])
args = parser.parse_args()
print(args)
Хотя это работает на поверхности, на практике это работает не так, как задумано:
$ program.py run # OK
Namespace(main_arg=False)
$ program.py run -main_arg # OK
Namespace(main_arg=True)
$ program.py -main_arg run # BAD: expected main_arg to be True
Namespace(main_arg=False)
Поведениенаблюдаемый при синтаксическом анализе program.py -main_arg run
иллюстрирует ключевое отношение: родительский argparser и его подпарасеры являются независимыми синтаксическими анализаторами, где родительский анализирует все аргументы до позиционного аргумента подпрограммы «команда», а затем выбранный подпарсер анализирует остальные аргументы в том же пространстве имен, что и родительский, без учета атрибутов, которые могли быть установленыродитель.