2013-07-24 2 views
1

Я хотел бы написать скрипт Python под названием sync, который имеет три или четыре режима работы, каждый из которых получает различное количество аргументов. Например,Python, argparse: разные параметры с различным количеством аргументов

sync set_version <build> <version_number> 
sync get_version <build> 
sync has_started <build_1> <build_2> ... <build_n> 

Я попытался с помощью subparsers argparse «s для каждого режима работы:

import argparse 

parser = argparse.ArgumentParser(description='Build synchronization mechanism') 
subparsers = parser.add_subparsers() 

parser_get_version = subparsers.add_parser('get_version') 
parser_get_version.add_argument('build') 

parser_update_version = subparsers.add_parser('update_version') 
parser_update_version.add_argument('build') 
parser_update_version.add_argument('version') 

args = parser.parse_args() 
print args 

Проблема заключается в том, что сообщение помощь не отражает структуру из аргументы каждого режима работы. Вместо этого он просто перечисляет режимы работы:

usage: sync.py [-h] {get_version,update_version} ... 

Build synchronization mechanism 

positional arguments: 
    {get_version,update_version} 

optional arguments: 
    -h, --help   show this help message and exit 

Как заставить argparse отобразить полное сообщение справки, со всеми параметрами subparsers?

+0

Это может быть актуально: http://stackoverflow.com/questions/14918804/how-to-show-help-for-all-subpasers-in-argparse – jsalonen

+0

Возможно, вы захотите проверить ['docopt'] (http://docopt.org/) для этой работы - я хорошо разбираюсь в библиотеке. Вы даете описание в аналогичном стиле с помощью справки, которую вы обычно получаете, и оно автоматически анализирует аргументы командной строки в простой структуре данных и, как представляется, выводит справку по своему желанию. –

ответ

1

У каждой подкоманды есть своя собственная помощь; попробуйте sync.py get_version --help, например.

Вам придется переопределить действие справки самостоятельно, а также перебрать подкоманды и распечатать справку для каждого. Для этого требуется некоторый недостаток с внутренними атрибутами:

class HelpAction(argparse._HelpAction): 
    def __call__(self, parser, namespace, values, option_string=None): 
     parser.print_help() 

     for group in parser._subparsers._group_actions: 
      group.choices.values()[0].print_help() 

     parser.exit() 

parser = argparse.ArgumentParser(description='Build synchronization mechanism', 
           add_help=False) 
parser.add_argument('-h', '--help', action=HelpAction, default=argparse.SUPPRESS, 
    help=argparse._('show this help message and exit')) 

Возможно, вы захотите еще немного настроить выход.

+0

Это правда, но я хотел бы перечислить помощь для всех режимов работы вместе. –

Смежные вопросы