我想像这样使用我的脚本:
python test.py run
python test.py stop
Run Code Online (Sandbox Code Playgroud)
我的代码是这样的:
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')
Run Code Online (Sandbox Code Playgroud)
当我执行它时,会引发异常:
ValueError: mutually exclusive arguments must be optional
Run Code Online (Sandbox Code Playgroud)
所以required=False当我添加每个参数时我尝试添加.然后我得到另一个例外:
TypeError: 'required' is an invalid argument for positionals
Run Code Online (Sandbox Code Playgroud)
我糊涂了.
更好的方法是添加一个可以有两个选择的位置参数.由于您希望它是可选的,因此使用nargs='?',这意味着零次或一次:
parser = argparse.ArgumentParser()
parser.add_argument('run', help='run or stop', nargs='?', choices=('run', 'stop'))
Run Code Online (Sandbox Code Playgroud)
如果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')
Run Code Online (Sandbox Code Playgroud)
当然,问题在于用户还需要提供连字符,但如果你这样限制自己,那就是你可以期待的那种问题.
您可以使用 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='?')
Run Code Online (Sandbox Code Playgroud)
这将使您可以使用
python test.py run
Run Code Online (Sandbox Code Playgroud)
要么
python test.py stop
Run Code Online (Sandbox Code Playgroud)
但不是
python test.py run stop
Run Code Online (Sandbox Code Playgroud)