Argparse子解析器:在命令列表中隐藏metavar

15

我在我的程序中使用Python argparse模块来处理命令行子命令。我的代码基本上是这样的:

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,但这只会隐藏帮助输出中的所有子命令。


metavar设置为None(或者不设置)怎么样?-- 或者将metavar=''设置为什么... - mgilson
谢谢回答!如果我将其设置为None,我只会得到所有命令的列表,如果我使用metavar='',我会得到一个空行。在这两种情况下,我都失去了用法行中的metavar。 - Jeppe Ledet-Pedersen
哦,我现在明白你想要什么了。不幸的是,我不知道如何实现它。 - mgilson
我认为我需要实现一个自定义的HelpFormatter。 - Jeppe Ledet-Pedersen
很遗憾,这样做不行,因为“Argparse”没有暴露足够的内部信息,使得创建自定义“HelpFormatter”对象变得容易。 - mgilson
1个回答

20

我通过添加一个新的 HelpFormatter,并在格式化 PARSER 动作时删除该行来解决了这个问题:

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

非常棒的解决方案。加一赞,因为以简单的方式解决了令人烦恼的问题。 - Christopher
感谢提供这个方法。当添加到 argparse.ArgumentParser(formatter_class=SubcommandHelpFormatter) 时,按预期工作。 - R J

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接