如何使用python argparse解析多个嵌套子命令?

发布于 2021-01-29 19:17:20

我正在实现一个命令行程序,其界面如下:

cmd [GLOBAL_OPTIONS] {command [COMMAND_OPTS]} [{command [COMMAND_OPTS]} ...]

我已经阅读了argparse文档。我可以GLOBAL_OPTIONS使用add_argumentin实现为可选参数argparse。以及{command [COMMAND_OPTS]}using子命令

从文档看来,我只能有一个子命令。但是如您所见,我必须实现一个或多个子命令。解析此类命令行参数使用的最佳方法是什么argparse

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    @mgilson对这个问题有很好的答案。但是我自己拆分sys.argv的问题是我丢失了Argparse为用户生成的所有有用的帮助消息。所以我最终这样做:

    import argparse
    
    ## This function takes the 'extra' attribute from global namespace and re-parses it to create separate namespaces for all other chained commands.
    def parse_extra (parser, namespace):
      namespaces = []
      extra = namespace.extra
      while extra:
        n = parser.parse_args(extra)
        extra = n.extra
        namespaces.append(n)
    
      return namespaces
    
    argparser=argparse.ArgumentParser()
    subparsers = argparser.add_subparsers(help='sub-command help', dest='subparser_name')
    
    parser_a = subparsers.add_parser('command_a', help = "command_a help")
    ## Setup options for parser_a
    
    ## Add nargs="*" for zero or more other commands
    argparser.add_argument('extra', nargs = "*", help = 'Other commands')
    
    ## Do similar stuff for other sub-parsers
    

    现在,在第一次解析之后,所有链接的命令都存储在中extra。我会在它不为空的情况下对其进行重新解析,以获取所有链接的命令并为其创建单独的命名空间。而且我得到了argparse生成的更好的用法字符串。



知识点
面圈网VIP题库

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

去下载看看