选项前显示的 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']
默认组是 positional
和 options
。 add_subparsers
将其 Action 放在 positional
组中,除非给定 title
。在这种情况下,它会创建一个新组。
您可以调整 format_help
以重新排序它传递给格式化程序的组。
或者它可能会像您对选项所做的那样更改 'positional arguments' 标题(而不是给 subparsers
title
参数)。
无论如何,行为的关键在于这两个方法。
使用 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']
默认组是 positional
和 options
。 add_subparsers
将其 Action 放在 positional
组中,除非给定 title
。在这种情况下,它会创建一个新组。
您可以调整 format_help
以重新排序它传递给格式化程序的组。
或者它可能会像您对选项所做的那样更改 'positional arguments' 标题(而不是给 subparsers
title
参数)。
无论如何,行为的关键在于这两个方法。