2013-07-24 109 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

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