我在python中有以下代码:
parser = argparse.ArgumentParser(description='Deployment tool')
group = parser.add_mutually_exclusive_group()
group.add_argument('-a', '--add', dest='name_to_add', help='Add a new group or a role to existing group')
group.add_argument('-u', '--upgrade', dest='name_to_upgrade', help='Upgrade a group with the new version')
parser.add_argument('--web_port', help='Port of the WEB instance that is being added to the group')
Run Code Online (Sandbox Code Playgroud)
我的问题是"--web_port"选项.我希望能够仅使用"-a"选项添加此选项,但不能使用"-u"添加此选项.
我希望能够运行:"python my_script.py -a name --web_port = XXXX".
我不想运行:"python my_script.py -u name --web_port = XXXX"
我应该如何更改代码以便能够以这种方式运行它?
谢谢,阿尔沙夫斯基亚历山大.
che*_*ner 36
您可能希望将它们作为子命令,而不是拥有-a和-u可选.然后,--web-port选择add子命令:
python my_script.py add name --web_port=XXXX
python my_script.py upgrade name
Run Code Online (Sandbox Code Playgroud)
就像是:
parser = argparse.ArgumentParser(description='Deployment tool')
subparsers = parser.add_subparsers()
add_p = subparsers.add_parser('add')
add_p.add_argument("name")
add_p.add_argument("--web_port")
...
upg_p = subparsers.add_parser('upgrade')
upg_p.add_argument("name")
...
Run Code Online (Sandbox Code Playgroud)
如果你试试跑
my_script.py upgrade name --web_port=1234
Run Code Online (Sandbox Code Playgroud)
你会得到一个无法识别的参数"--web_port"的错误.
同样,如果你尝试
my_script.py add name upgrade
Run Code Online (Sandbox Code Playgroud)
你会得到一个无法识别的参数"upgrade"的错误,因为你只为'add'子命令定义了一个位置参数.
换句话说,子命令是隐式互斥的.唯一的小瑕疵是你需要为每个subparser添加"name"位置参数.