2012-11-16 15 views
8

我在我的程序中對命令行子命令使用Python argparse模塊。我的代碼基本如下所示:Argparse subparser:在命令列表中隱藏metavar

import argparse 

parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(title="subcommands", metavar="<command>") 

subparser = subparsers.add_parser("this", help="do this") 
subparser = subparsers.add_parser("that", help="do that") 

parser.parse_args() 

當運行「python test.py --help」我想列出可用的子命令。目前,我得到這樣的輸出:

usage: test.py [-h] <command> ... 

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

subcommands: 
    <command> 
    this  do this 
    that  do that 

我可以以某種方式刪除的子命令<command>行上市,仍然保持它的使用習慣?我曾嘗試給help = argparse.SUPPRESS作爲add_subparsers的參數,但是它只是隱藏了幫助輸出中的所有子命令。

+0

什麼'metavar'設置爲'None'(或離開其關閉)? - 或設置'metavar ='''... – mgilson

+0

感謝您的回答!如果我將它設置爲None,我只需要獲得所有命令的列表,如果我使用'metavar =''',我會得到一個空行。在這兩種情況下,我都會在使用行中失去metavar。 –

+0

哦,我現在得到你正在尋找的東西。不幸的是我不知道如何實現。 – mgilson

回答

10

我加入了新的HelpFormatter如果格式化解析器的行動,只是刪除行解決它:

class SubcommandHelpFormatter(argparse.RawDescriptionHelpFormatter): 
    def _format_action(self, action): 
     parts = super(argparse.RawDescriptionHelpFormatter, self)._format_action(action) 
     if action.nargs == argparse.PARSER: 
      parts = "\n".join(parts.split("\n")[1:]) 
     return parts 
+0

真棒解決方案。 +1以簡單的方式解決惱人的問題。 – Christopher

+0

感謝您的方法。按預期工作時添加到:'argparse.ArgumentParser(formatter_class = SubcommandHelpFormatter)' –