2013-07-24 143 views
1

我想编写一个名为sync的Python脚本,它具有三种或四种操作模式,每种操作模式都接收不同数量的参数。例如,Python,argparse:具有不同参数个数的不同参数

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

我使用​​的subparsers对于每种操作模式的尝试:

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

您必须自己重写帮助操作,并遍历子命令并为每个子命令打印帮助。这需要一些与内部属性foibling:

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

的确如此,但我想列出所有操作模式的帮助。 –