【发布时间】:2021-12-06 13:30:51
【问题描述】:
我正在尝试实现一个程序,它同时使用子命令(例如:程序子命令 [options])和组(这使得一个花哨的帮助对话框)。
我已经实现了这个目标,但有一个小例外:为了在自己的组中获得帮助对话框,我必须在创建子命令解析器时添加标志 add_help=False,这会在运行顶部时删除帮助消息-级别帮助对话框(例如:program -h)。
这是我开发的代码:
# imports
import argparse
# create the top-level parser
parser = argparse.ArgumentParser(prog="example", add_help=False, epilog="A very cool program")
# add top-level groups
toplevel = parser.add_argument_group("Global arguments")
toplevel.add_argument("-g", "--global", action="store_true", help="A global argument.")
help = parser.add_argument_group("Help dialog")
help.add_argument("-h", "--help", action="help", default=argparse.SUPPRESS, help="Show this help message and exit.")
# create subparser
subparsers = parser.add_subparsers(title="Available subcommands", dest="subcommand")
# create the parser for the "a" subcommand
parser_a = subparsers.add_parser("a", add_help=False)
# add groups for subcommand "a"
required_a = parser_a.add_argument_group("Required arguments")
required_a.add_argument("--bar", type=int, help="Flag bar help", required=True)
help_a = parser_a.add_argument_group("Help dialog")
help_a.add_argument("-h", "--help", action="help", default=argparse.SUPPRESS, help="Show this help message and exit.")
# create the parser for the "b" command
parser_b = subparsers.add_parser("b", add_help=False)
# add groups for subcommand "b"
required_b = parser_b.add_argument_group("Required arguments")
required_b.add_argument("--baz", help="Flag baz help", required=True)
optional_b = parser_b.add_argument_group("Optional arguments")
optional_b.add_argument("--tas", help="Flag tas help")
help_b = parser_b.add_argument_group("Help dialog")
help_b.add_argument("-h", "--help", action="help", default=argparse.SUPPRESS, help="Show this help message and exit.")
# parse arguments
args = parser.parse_args()
# provide args to main
print(args)
顶层帮助如下:
$ example -h
usage: example [-g] [-h] {a,b} ...
Global arguments:
-g, --global A global argument.
Help dialog:
-h, --help Show this help message and exit.
Available sub-commands:
{a,b}
A very cool program
如您所见,子命令上没有显示帮助消息。
为了让它们出现,我必须在创建 parser_a 和 parser_b 时去掉 add_help=False,但正如预期的那样,当我定义自己的帮助标志时会引发问题。
基本上我希望两全其美,我的主要对话将是:
$ example -h
usage: example [-g] [-h] {a,b} ...
Global arguments:
-g, --global A global argument.
Help dialog:
-h, --help Show this help message and exit.
Available sub-commands:
{a,b}
a Help for sub-command a.
b Help for sub-command b.
A very cool program
子命令是:
$ example a -h
usage: example a --bar BAR [-h]
Required arguments:
--bar BAR Flag bar help
Help dialog:
-h, --help Show this help message and exit.
在浏览了 argparse 源代码后,选项conflict_handler 是一个可能的解决方案吗?是否可以告诉它忽略原始帮助对话框,该对话框显示在我不想要的位置参数下,而是显示在我自己的组中但不完全禁用它?
TL;DR: 寻找我的 Python 脚本所需的修改,以便 argparse 输出前两个代码块。
注意:标题之所以写“help-dialog”是因为堆栈溢出不允许我在标题上写世界“帮助”,不管写在哪里在句子中。
【问题讨论】:
-
使用正常的子解析器设置,
example -h将显示主解析器的组和子命令(subparsers实际上是主解析器的位置参数)。example a -h,将解析传递给parser_a,然后它又响应-h,显示它自己的组。主解析器对子解析器的参数一无所知,对子解析器也是如此。 -
我想你的“帮助对话框”替代品的行为方式相同,但我不能肯定地说。目前尚不清楚您缺少什么或期望什么。
-
我已经编辑了帖子以使自己更清楚,因为 cmets 中的字符限制非常低。我期望的是在主帮助对话框的子命令部分下方有一条帮助消息,并且在子命令帮助对话框中,将帮助命令放在它自己的组中。由于某种原因,这很难解释,但如果你看到最后两个代码块,那正是我想要实现的。
标签: python command-line-interface argparse