我正在尝试使用如下脚本编写脚本:
my_script [-p parg -l larg] | [-s sarg]
即脚本要么采用-p
和-l
参数 OR -s
参数。如果同时指定-p
和-s
,则会出错。我尝试了以下但似乎没有工作
import argparse
parser = argparse.ArgumentParser(description='Some Desc')
gp = parser.add_mutually_exclusive_group()
num_gp = gp.add_argument_group()
num_gp.add_argument('-p')
num_gp.add_argument('-l')
gp.add_argument('-s')
In [18]: parser.parse_args(['-p blahp', '-l blahl', '-s blahs'])
Out[18]: Namespace(l=' blahl', p=' blahp', s=' blahs') #ERROR Should have failed as I specify both `-p` and `-s` which belong to a mutually_exclusive_group
答案 0 :(得分:0)
我认为你滥用互斥的群体。组不与其他组互斥,组的成员彼此互斥。另外,据我所知docs,标准组不会影响解析逻辑,它们只能帮助组织解析器生成的帮助消息。
以下是如何制作两个选项,例如-p
和-s
互斥:
import argparse
parser = argparse.ArgumentParser(description='Some Desc')
group1 = parser.add_mutually_exclusive_group()
group1.add_argument("-p")
group1.add_argument("-s")
# This works
args = parser.parse_args(["-p", "argForP"])
# This will throw an error
args = parser.parse_args(["-p", "argForP", "-s", "argForS"])
但我不确定此功能是否允许您实现您的用例,因为我不确定参数是否属于两个互斥组。但是,您始终可以自行进行错误检查,并使用parser.error
。这看起来像这样:
message = "invalid options"
# Tells us p is used without l or vise versa
if (args.p is None) != (args.l is None):
parser.error(message)
# Tells is if p-l is used with s
if (args.p is None) == (args.s is None):
# Either both are used or neigher
parser.error(message)