如何删除 argparse 中使用行末尾的三点

How can I remove three-dots at the end of usage line in argparse

Python argparse 继续在 usage: 行的末尾放置 space 和三点 ( ...),示例:usage: program.sh [-h] command [<options>...] ....是否可以删除它们?

示例代码:

def helper():
    parser = argparse.ArgumentParser(
        "program.py",              
    )
    subparsers = parser.add_subparsers(dest="command", metavar="command [<options>...]")
    driver = subparsers.add_parser(
        "driver", help="Example script")
    driver.add_argument("--bn", type=int, default=0, help="Block number to start fetch blocks from")
    return parser

输出:

$ ./program.sh --help
usage: program.sh [-h] command [<options>...] ...

直接回答:您可以编写自己的使用摘要:

parser = argparse.ArgumentParser(
    "program.py",                  
    usage="usage: %(prog)s [-h] command [<options>...]",
)

但是,有些东西对我来说没有意义。

... 是由于使用子解析器造成的。通常每个命令有一个子解析器,例如:3 个命令,即 3 个子解析器:

Usage:
myprog cmd1 [options and args specific for cmd1]
myprog cmd2 [different options and args for cmd2]
myprog cmd3 [yet another set of options and args]

这很难用一行来概括,除了:

Usage: myprog command ...

除非您没有为命令使用任何选项和参数,这意味着没有什么可解析的。

因此,如果您想去掉结尾的 ... 并仍然有一个有效的用法概要,您可能根本不需要子解析器。

该用法是由 subparsers 参数的隐含 nargs 产生的,'A...'。

如果我使用相同的 nargs 创建位置参数,我会得到同样的结果:

In [393]: import argparse
In [394]: p = argparse.ArgumentParser()
In [395]: p.add_argument('foo',nargs=argparse.PARSER)
Out[395]: _StoreAction(option_strings=[], dest='foo', nargs='A...', const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [396]: p.print_help()
usage: ipython3 [-h] foo ...

positional arguments:
  foo

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

注意 Out[395] 中的 nargs 字符串。 add_subparsers 使用 'A...' nargs 值创建位置参数。

In [403]: p = argparse.ArgumentParser()
In [404]: p.add_subparsers(dest='foo', metavar='FOO')
Out[404]: _SubParsersAction(option_strings=[], dest='foo', nargs='A...', const=None, default=None, type=None, choices={}, help=None, metavar='FOO')
In [405]: p.print_help()
usage: ipython3 [-h] FOO ...

positional arguments:
  FOO

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

nargs 需要至少一个字符串,但需要所有剩余的字符串。 add_parser 行将 choices 添加到该子解析器操作。

在格式化它的 usage 时,主解析器对子解析器的工作“一无所知”。对它来说,subparsers 参数只是 choices 的另一个位置参数。解析时也是如此。它只是用剩余的 argv 字符串执行 suparsers.__call__。这又将它们传递给所选的 parser.