选项前显示的 Argparse 子解析器帮助

Argparse subparser help displayed before options

使用 argparse,目前我的 main.py --help 看起来像这样

usage: main.py [--options] <command>

options:
  -h, --help  show this help message and exit
  --debug     Logs extra information for debugging
  --version   show program's version number and exit
  --license   reads the GPLv3

commands:

    install   install packages
    remove    remove packages
    update    update package list and upgrade the system

有没有简单的方法让子解析器命令显示在全局选项之前?

目前我的配置比 post 有点长,但如果需要上下文,我可以。我没有发生任何疯狂的事情,这是重要的事情。

formatter = lambda prog: argparse.RawDescriptionHelpFormatter(prog,
                                                max_help_position=64)
bin_name = Path(argv[0]).name
version = __version__
parser = nalaParser(    formatter_class=formatter,
                        usage=f'{bin_name} [--options] <command>', 
                        )

subparsers = parser.add_subparsers(title='commands', metavar='', dest='command')
parser._optionals.title = "options"

install_parser = subparsers.add_parser('install', help='install packages')
remove_parser = subparsers.add_parser('remove', help='remove packages')
update_parser = subparsers.add_parser('update', help='update package list and upgrade the system')

parser.add_argument('--debug', action='store_true', help='Logs extra information for debugging')
parser.add_argument('--version', action='version', version=f'{bin_name} {version}')
parser.add_argument('--license', action=GPLv3)

因为我已经在子类化了,所以我只是在下面将这个方法添加到 nalaParser

def format_help(self):
    formatter = self._get_formatter()

    # usage
    formatter.add_usage(self.usage, self._actions,
                        self._mutually_exclusive_groups)

    # description
    formatter.add_text(self.description)

    index = -1
    # Put options last in the group
    for action_group in self._action_groups[:]:
        index = + 1
        if action_group.title == 'options':
            self._action_groups.append(self._action_groups.pop(index))

    # positionals, optionals and user-defined groups
    for action_group in self._action_groups:
        formatter.start_section(action_group.title)
        formatter.add_text(action_group.description)
        formatter.add_arguments(action_group._group_actions)
        formatter.end_section()


    # epilog
    formatter.add_text(self.epilog)

    # determine help from format above
    return formatter.format_help()

parser.format_help 按照创建顺序将 action_groups 传递给格式化程序。

In [24]: parser._action_groups
Out[24]: 
[<argparse._ArgumentGroup at 0x7f8167ac02e0>,
 <argparse._ArgumentGroup at 0x7f8167ac0850>,
 <argparse._ArgumentGroup at 0x7f8167ac0490>]
In [25]: [a.title for a in parser._action_groups]
Out[25]: ['positional arguments', 'options', 'commands']

默认组是 positionaloptionsadd_subparsers 将其 Action 放在 positional 组中,除非给定 title。在这种情况下,它会创建一个新组。

您可以调整 format_help 以重新排序它传递给格式化程序的组。

或者它可能会像您对选项所做的那样更改 'positional arguments' 标题(而不是给 subparsers title 参数)。

无论如何,行为的关键在于这两个方法。