argparse:如何使互斥参数可选?

时间:2016-08-23 04:02:34

标签: python python-2.7

我想像这样使用我的脚本:

python test.py run
python test.py stop

我的代码是这样的:

parser = argparse.ArgumentParser()
command_group = parser.add_mutually_exclusive_group(required=True)
command_group.add_argument('run', help='run it', action='store_true')
command_group.add_argument('stop', help='stop it', action='store_true')

当我执行它时,会引发异常:

ValueError: mutually exclusive arguments must be optional

所以当我添加每个参数时,我尝试添加required=False。然后我得到另一个例外:

TypeError: 'required' is an invalid argument for positionals

我很困惑。

2 个答案:

答案 0 :(得分:8)

更好的方法是添加一个可以有两个选择的位置参数。由于您希望它是可选的,因此请使用nargs='?',这意味着零次或一次:

parser = argparse.ArgumentParser()
parser.add_argument('run', help='run or stop', nargs='?', choices=('run', 'stop'))

如果给出run,则值为'run'。如果给出stop,则为'stop'。如果两者都不给出,则为None

如果您真的想使用互斥的群组,我不确定您是否可以按照自己的意愿行事。但是,可以通过添加连字符来使它们成为可选参数:

import argparse

parser = argparse.ArgumentParser()
command_group = parser.add_mutually_exclusive_group()
command_group.add_argument('-run', help='run it', action='store_true')
command_group.add_argument('-stop', help='stop it', action='store_true')

当然问题在于用户还需要提供连字符,但如果你这样限制自己就会出现这种问题。

答案 1 :(得分:3)

您可以使用nargs='?'

实现此目的
parser = argparse.ArgumentParser()
command_group = parser.add_mutually_exclusive_group()
command_group.add_argument('run', help='run it', nargs='?')
command_group.add_argument('stop', help='stop it', nargs='?')

允许您使用

调用该程序
python test.py run

python test.py stop

python test.py run stop