如何正确使用 argparse 子解析器?

我已经在这里和一般情况下搜索了大量的子解析器示例,但似乎无法理解这个看似简单的东西。

我有两个 var 类型,其中一个有约束,因此认为 subparser 是解决方法。例如-t 允许“ A”或“ B”。如果用户传递“ A”,那么他们还需要指定它是“ a1”还是“ a2”。如果他们只通过了“ B”那就什么都没有了。

我可以做到这一点,并让 arparse 返回我什么类型的“ 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
98546 次浏览

子解析器是基于第一个 位置参数的值调用的,因此您的调用将类似于

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是为主解析器定义的,所以必须为 之前指定参数,该参数指定用于其余参数的子解析器。