我一直在搜索这里的一些subparser示例,但总的来说似乎无法想象这个看似简单的东西。
我有两个var类型,其中一个有约束,所以认为subparser是要走的路。例如-t允许“A”或“B”。如果用户通过“A”,那么他们还需要指定它是“a1”还是“a2”。如果他们只通过“B”那么没有。
我可以这样做并让argparse返回我通过了什么类型的“A”或者它只是“B”?
下面似乎有效,但由于某种原因,在subparse之后传递任何东西时都会中断。
e.g。来自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
答案 0 :(得分:46)
根据第一个位置参数的值调用子分析符,因此您的调用看起来像
python test01.py A a1 -v 61
“A”触发相应的subparser,它将被定义为允许位置参数和-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
,因此必须在之前指定,该参数指定哪个子解析器用于其余参数。