【问题标题】:How to use argparse subparsers correctly?如何正确使用 argparse 子解析器?
【发布时间】:2013-06-09 01:10:17
【问题描述】:

我一直在这里和一般情况下搜索很多子解析器示例,但似乎无法弄清楚这个看似简单的事情。

我有两种 var 类型,其中一种有约束,所以认为 subparser 是要走的路。例如-t 允许“A”或“B”。如果用户通过“A”,那么他们还需要进一步指定它是“a1”还是“a2”。如果他们只通过“B”,那么什么都不会。

我可以这样做并让 argparse 返回我传递了什么类型的“A”还是只是“B”?

以下似乎可行,但由于某种原因在子解析之后传递任何内容时会中断。

例如来自 linux 终端

>> python test01.py -t A a1 -v 61

错误...

usage: test01.py a1 [-h]
test01.py a1: error: unrecognized arguments: -v

希望这是有道理的。

代码:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='types of A')

parser.add_argument("-t",
                    choices = ["A", "B"],
                    dest = "type",
                    required=True,
                    action='store',
                    help="Some help blah blah")

cam_parser = subparsers.add_parser('a1', help='Default')
cam_parser.set_defaults(which='a1')

cam_parser = subparsers.add_parser('a2', help='parse this instead of default')
cam_parser.set_defaults(which='a2')


parser.add_argument("-v",
                    nargs = '+',
                    required=True,
                    dest = "version",
                    type=int,
                    action='store',
                    help="some version help blah blah")   

argument = parser.parse_args()

print argument.type
print argument.version

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    根据第一个 positional 参数的值调用子解析器,因此您的调用看起来像

    python test01.py A a1 -v 61
    

    “A”触发适当的子解析器,该子解析器将被定义为允许位置参数和-v 选项。

    因为argparse 不会对参数和选项可能出现的顺序施加任何限制,并且没有简单的方法可以在解析开始后修改可能出现的参数/选项(涉及修改解析器实例的自定义操作可能会起作用),您应该考虑替换 -t 本身:

    import argparse
    
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers(help='types of A')
    parser.add_argument("-v", ...)
    
    a_parser = subparsers.add_parser("A")
    b_parser = subparsers.add_parser("B")
    
    a_parser.add_argument("something", choices=['a1', 'a2'])
    

    由于-v 是为主解析器定义的,因此必须在指定哪个子解析器用于其余参数的参数之前指定它。

    【讨论】:

    • 非常感谢。但是,当我出于某种原因通过 -v 时仍然出现错误,即它预期 -v 当我通过它时,我得到了我的旧错误“无法识别的参数”。即使我在位置参数之前通过了它。有任何想法吗?我一直试图找到一个类似的例子,但运气不佳。
    • before the argument that specifies which subparser 是指用户输入参数的代码还是两者兼而有之?
    • 执行group1 = parser.add_subparsers(help='subparser group 1')group2 = parser.add_subparsers(help='subparser group 2') 时出现error:cannot have multiple subparser arguments 错误。我希望用它来分组子命令。
    • @MinhTran 在这种情况下,您需要使用a_parser.add_subparsers()b_parser.add_subparsers()
    猜你喜欢
    • 2021-05-11
    • 1970-01-01
    • 2013-02-27
    • 2018-04-23
    • 2012-01-05
    • 2018-12-31
    • 2011-09-09
    • 1970-01-01
    • 2015-07-17
    相关资源
    最近更新 更多