Python argparse互斥组

Python argparse互斥组,python,argparse,Python,Argparse,我需要的是: pro [-a xxx | [-b yyy -c zzz]] 我试过了,但没用。有人能帮我吗 group= parser.add_argument_group('Model 2') group_ex = group.add_mutually_exclusive_group() group_ex.add_argument("-a", type=str, action = "store", default = "", help="test") group_ex_2 = group_e

我需要的是:

pro [-a xxx | [-b yyy -c zzz]]
我试过了,但没用。有人能帮我吗

group= parser.add_argument_group('Model 2')
group_ex = group.add_mutually_exclusive_group()
group_ex.add_argument("-a", type=str, action = "store", default = "", help="test")
group_ex_2 = group_ex.add_argument_group("option 2")
group_ex_2.add_argument("-b", type=str, action = "store", default = "", help="test")
group_ex_2.add_argument("-c", type=str, action = "store", default = "", help="test")

谢谢

添加互斥组
不会使整个组互斥。它使组内的选项相互排斥

你要找的是。代替prog[-a xxxx |[-b yyy-c zzz]],您将有:

prog 
  command 1 
    -a: ...
  command 2
    -b: ...
    -c: ...
要使用第一组参数调用,请执行以下操作:

prog command_1 -a xxxx
prog command_2 -b yyyy -c zzzz
要使用第二组参数调用:

prog command_1 -a xxxx
prog command_2 -b yyyy -c zzzz
还可以将子命令参数设置为位置参数

prog command_1 xxxx
有点像git或svn:

git commit -am
git merge develop
工作示例 测试一下 祝你好运。

有一个python补丁(正在开发中)可以让你做到这一点。

其想法是允许相互排斥的组重叠。因此,
用法
可能看起来像:

pro [-a xxx | -b yyy] [-a xxx | -c zzz]
更改argparse代码以便可以像这样创建两个组是最简单的部分。更改
用法
格式化代码需要编写自定义
帮助格式化程序

argparse
中,操作组不会影响解析。它们只是一个
帮助
格式化工具。在
帮助
中,相互排斥的组仅影响
用法
行。解析时,
解析器
使用相互排斥的组来构造潜在冲突的字典(
a
不能与
b
c
b
不能与
a
等一起出现),然后如果出现冲突,就会引发错误

如果没有argparse补丁,我认为最好的选择是测试
parse_args
自己生成的名称空间(例如,如果
a
b
都有非默认值),并提出自己的错误。您甚至可以使用解析器自己的错误机制

parser.error('custom error message')
虽然对于复杂的选项来说非常好,但是有一个非常简单的解决方案可以用于简单的情况,例如,1个选项排除了2个其他选项,如

command [- a xxx | [ -b yyy | -c zzz ]] 
甚至像原来的问题一样:

pro [-a xxx | [-b yyy -c zzz]]
我会这样做:

parser = argparse.ArgumentParser()

# group 1 
parser.add_argument("-q", "--query", help="query", required=False)
parser.add_argument("-f", "--fields", help="field names", required=False)

# group 2 
parser.add_argument("-a", "--aggregation", help="aggregation",
                    required=False)
我在这里使用提供给命令行包装器的选项来查询mongodb。
collection
实例可以调用方法
aggregate
或方法
find
,使用可选参数
query
字段
,因此您可以看到前两个参数兼容而后一个不兼容的原因

现在我运行
parser.parse_args()
并检查它的内容:

args = parser().parse_args()

print args.aggregation
if args.aggregation and (args.query or args.fields):
    print "-a and -q|-f are mutually exclusive ..."
    sys.exit(2)

当然,这个小技巧只适用于简单的情况,如果你有许多相互排斥的选项和组,那么检查所有可能的选项将成为一场噩梦。在这种情况下,您应该像Jonathan建议的那样将您的选项插入命令组。

可能重复插入,但我想提及我的库。让你做这个问题想要做的事情,例如,不需要你使用子命令(如在接受的答案中)或自己验证一切(如在第二高投票率的回答中)。我已经把它们放在一个参数组下。在这种情况下,如何添加子命令?谢谢用示例代码更新。你不会使用分组,而是子分组。但是你会怎么做OP最初要求的事情呢?我目前有一组子命令,但其中一个子命令确实需要能够在
[-a].[-b-c]]
之间进行选择。这并不能回答问题,因为它不允许您发出“noname”命令并实现OP要求的
[-a xxx |[-b yyy-c zzz]]
Python问题:正在探索让您编写自定义独占/包含测试的方法。对于这种情况,我不会将其称为“黑客”,因为它看起来更具可读性和可管理性-感谢您指出!更好的方法是使用
parser.error(“-a和-q…”)
。通过这种方式,将自动打印完整的使用帮助。请注意,在这种情况下,您还需要验证以下情况:(1)在第一组is用户中,
q
f
都是必需的,(2)这两个组中的任何一个都是必需的。这使得“简单”解决方案不再那么简单。所以我同意这是对手工脚本的更多攻击,但不是真正的解决方案