argparse参数嵌套

26

我有以下的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')

我的问题是关于"--web_port"选项。我想要只能在使用"-a"选项时添加此选项,而不是在使用"-u"选项时添加。

希望能够运行:"python my_script.py -a name --web_port=XXXX"。

不希望能够运行:"python my_script.py -u name --web_port=XXXX"。

我应该如何更改代码以便能够以这种方式运行它?

谢谢,Arshavski Alexander。


1个回答

48

你可以把选项-a-u改成子命令,然后将--web-port作为add子命令的选项。

python my_script.py add name --web_port=XXXX
python my_script.py upgrade name

类似这样:

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")
...

如果您尝试运行

my_script.py upgrade name --web_port=1234

如果您尝试使用未被识别的参数"--web_port",将会收到一个错误提示。

同样地,如果您尝试

my_script.py add name upgrade

如果您只为 'add' 子命令定义了单个位置参数,则使用未识别的参数 "upgrade" 将导致错误。

换句话说,子命令隐式地互斥。唯一的小问题是您需要在每个子解析器中添加 "name" 位置参数。


谢谢您的快速回复。但是我需要添加和升级是互斥的。 - alexarsh
1
作为子命令,它们将是 python my_script.py add name --web_port=XXX upgrade。例如,将把 upgrade 作为 add 子命令的位置参数,而不是对 upgrade 子命令的调用。(我想;我已经有一段时间没有实现子命令了。) - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接