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

发布于 2021-01-29 19:10:40

我的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)
关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这有点棘手,因为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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看