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”

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

谢谢,阿尔沙夫斯基亚历山大。

4

1 回答 1

46

您可能想让它们成为子命令,而不是拥有-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

您将收到无法识别的参数“升级”的错误,因为您只为“添加”子命令定义了一个位置参数。

换句话说,子命令是隐式互斥的。唯一的小缺点是您需要将“名称”位置参数添加到每个子解析器。

于 2012-08-01T13:46:55.787 回答