我想像这样使用我的脚本:
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
我很困惑。
答案 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