【发布时间】:2016-01-26 01:33:52
【问题描述】:
我正在尝试找到一种解析相关参数序列的方法,最好使用argparse。
例如:
command --global-arg --subgroup1 --arg1 --arg2 --subgroup2 --arg1 --arg3 --subgroup3 --arg4 --subcommand1 --arg1 --arg3
其中--global-arg 适用于整个命令,但每个--subgroupN 参数都有仅适用于它的子参数(并且可能具有相同的名称,例如上面的--arg1 和--arg3),以及一些子参数是可选的,因此子参数的数量不是恒定的。但是,我知道每个 --subgroupN 子参数集是通过另一个 --subgroupN 的存在或参数列表的末尾来完成的(如果全局参数不能出现在末尾,我不会大惊小怪,尽管我想那是可能,只要它们不与子参数名称冲突)。
--subgroupN 元素本质上是子命令,但我似乎无法使用 argparse 的子解析器功能,因为它也吞下任何后续 --subgroupN 条目(因此会出现意外的 barfs论据)。
(xmlstarlet使用了这种风格的参数列表的一个例子)
除了编写我自己的解析器之外,还有什么建议吗?如果这是唯一的选择,我认为我至少可以利用 argparse 中的一些东西......
示例
下面的示例试图找到一种方法来解析参数结构,如下所示:
(a --name <name>|b --name <name>)+
在第一个示例中,我希望 --a 和 --b 引入一组由子解析器处理的参数。
我希望得到一些可能类似于
的东西Namespace(a=Namespace(name="dummya"), b=Namespace(name="dummyb"))
子解析器示例失败
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser_a = subparsers.add_parser("a")
parser_b = subparsers.add_parser("b")
parser_a.add_argument("--name")
parser_b.add_argument("--name")
parser.parse_args(["a", "--name", "dummy"])
> Namespace(name='dummy') (Good)
parser.parse_args(["b", "--name", "dummyb", "a", "--name", "dummya"])
> error: unrecognized arguments: a (BAD)
互斥组失败
parser = argparse.ArgumentParser()
g = parser.add_mutually_exclusive_group()
g1 = g.add_mutually_exclusive_group()
g1.add_argument("--name")
g2 = g.add_mutually_exclusive_group()
g2.add_argument("--name")
> ArgumentError: argument --name: conflicting option string(s): --name (BAD)
(我真的没想到这会奏效,我想看看我是否可以重复分组参数。)
【问题讨论】:
-
请编辑您的问题以显示您尝试过的代码。这样你会得到更好的答案。
-
之前至少有一个关于处理多个子命令的 SO 问题。解决方案涉及诸如递归子命令之类的事情。没有一个是
argparse的直接用法。 -
搜索
[argparse] multiple出现这样的帖子,stackoverflow.com/q/25318622/901925
标签: python-2.7 argparse