当前位置: 首页 > 面试题库 >

argparse次解析器整体式帮助输出

萧胜
2023-03-14
问题内容

我的argparse在顶层只有3个标记(store_true),其他所有内容都通过子解析器处理。当我运行时myprog.py --help,输出显示所有子命令的列表,如正常的{sub1, sub2, sub3, sub4, ...}。因此,默认设置效果很好…

我通常不记得我需要的确切子命令名称及其所有选项。因此,我最终进行了2个帮助查找:

myprog.py --help
myprog.py sub1 --help

我经常这样做,所以我决定将其塞入一步。我宁愿让我的顶级帮助输出大量摘要,然后手动滚动列表。我发现它快得多(至少对我来说)。

我正在使用RawDescriptionHelpFormatter,然后手动输入长帮助输出。但是现在我有很多子命令,这变得难以管理。

有没有一种方法可以只通过一个程序调用就获得详细的帮助输出?

如果不是,我该如何迭代我的argparse实例的子解析器,然后分别从每个实例中检索帮助输出(以后将它们粘合在一起)?

这是我的argparse设置的快速概述。我清理/剥离了一些代码,因此如果没有一点帮助,它可能不会运行。

parser = argparse.ArgumentParser(
        prog='myprog.py',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description=textwrap.dedent(""" You can manually type Help here """) )

parser.add_argument('--debuglog', action='store_true', help='Verbose logging for debug purposes.')
parser.add_argument('--ipyonexit', action='store_true', help='Drop into an embeded Ipython session instead of exiting command.')

subparser = parser.add_subparsers()

### --- Subparser B
parser_b = subparser.add_parser('pdfreport', description="Used to output reports in PDF format.")
parser_b.add_argument('type', type=str, choices=['flatlist', 'nested', 'custom'],
                        help="The type of PDF report to generate.")
parser_b.add_argument('--of', type=str, default='',
                        help="Override the path/name of the output file.")
parser_b.add_argument('--pagesize', type=str, choices=['letter', '3x5', '5x7'], default='letter',
                        help="Override page size in output PDF.")
parser_b.set_defaults(func=cmd_pdf_report)

### ---- Subparser C
parser_c = subparser.add_parser('dbtables', description="Used to perform direct DB import/export using XLS files.")
parser_c.add_argument('action', type=str, choices=['push', 'pull', 'append', 'update'],
                        help="The action to perform on the Database Tables.")
parser_c.add_argument('tablename', nargs="+",
                        help="The name(s) of the DB-Table to operate on.")
parser_c.set_defaults(func=cmd_db_tables)

args = parser.parse_args()
args.func(args)

问题答案:

这有点棘手,因为argparse不会直接公开定义的子解析器列表。但这是可以完成的:

import argparse

# create the top-level parser
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo', action='store_true', help='foo help')
subparsers = parser.add_subparsers(help='sub-command help')

# create the parser for the "a" command
parser_a = subparsers.add_parser('a', help='a help')
parser_a.add_argument('bar', type=int, help='bar help')

# create the parser for the "b" command
parser_b = subparsers.add_parser('b', help='b help')
parser_b.add_argument('--baz', choices='XYZ', help='baz help')
# print main help
print(parser.format_help())

# retrieve subparsers from parser
subparsers_actions = [
    action for action in parser._actions 
    if isinstance(action, argparse._SubParsersAction)]
# there will probably only be one subparser_action,
# but better safe than sorry
for subparsers_action in subparsers_actions:
    # get all subparsers and print help
    for choice, subparser in subparsers_action.choices.items():
        print("Subparser '{}'".format(choice))
        print(subparser.format_help())

该示例适用于python 2.7和python3。示例解析器来自argparse子命令的Python
2.7文档

剩下要做的唯一一件事就是为完整的帮助添加一个新的参数,或者替换内置的-h/--help



 类似资料:
  • 问题内容: 我制作了一个Python脚本,该脚本可以执行很多操作,因此它具有许多选项,因此我将其划分为一些子解析器,这些子解析器也使用父解析器进行常见选项分组。 我想要一个帮助选项,该选项将显示所有命令及其选项的帮助,是否可以不覆盖format_help方法? 我看到了类似的问题,但是分组对我来说并不重要,我只想在那里找到选项。 例如: 在这种情况下,我希望如果有人运行./script.py -h

  • 问题内容: 我想在脚本中定义不同的子解析器,两个子解析器均从同一个父级继承选项,但具有不同的默认值。但是,它没有按预期工作。 这是我所做的: 当我从命令行运行脚本时,得到的是: 显然,第二个覆盖了父对象中的第一个。由于argparse文档中没有任何内容(非常详细),所以我认为这可能是一个错误。 有一些简单的解决方案吗?之后,我可以检查变量,并使用每个子解析器的预期默认值替换值,但这就是我期望arg

  • 我想深入了解Jmeter输出。 > 我对吞吐量率的概念感到困惑。这是否意味着服务器在给定负载下只能处理48.1个请求/分钟,还是意味着其他什么。总吞吐量速率和单个请求显示的吞吐量速率之间的差异是什么。在我的情况下,发送了8个请求,单个请求显示吞吐量为6.1/min。请解释一下。 我需要建议服务器端的任何更改/解释jmeter报告,请建议我如何解释需要做什么。 总的总结报告如下: 总用户: 100上

  • 我需要一些帮助用JSOUP解析这个html。我正在尝试从表中的每一列获取数据值。我一直在看JSoup文档,试图弄清楚我到底需要做什么,但还是不确定。看起来网站使用了CSS和内联格式的组合;其中大部分可以转换为CSS并减小页面大小。 这是html文件的一个小片段(实际上差不多有5 MB大小)。 更新:我已经更新了源代码,以更准确地显示html的结构。我假定tbody将位于表元素中是一个给定的条件。我

  • 问题内容: 我正在使用Python 3.4,正在尝试与子解析器一起使用,并且我希望具有与Python 2.x中类似的行为,如果我不提供位置参数(以指示子解析器/子程序)我会收到一条有用的错误消息。即,随着我将得到以下错误消息: 我正在按照http://codingdict.com/questions/172394建议设置属性,但是这给了我Python 3.4.0错误: -完全追溯: 这是我的程序-

  • 问题内容: 我有以下代码(使用Python 2.7): 现在,我希望能够调用此程序,例如在普通程序或某些子命令后附加: 基本上,我需要声明可选的子解析器。我知道这并不是真正支持的方法,但是有任何解决方法或替代方法吗? 编辑:我得到的错误信息: 问题答案: 根据文档,带有(而不带有)的会自动打印版本号: