2012-08-01 68 views
16

我有Python中的下面的代码:argparse参数筑巢

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名称--web_port = XXXX”。

不想能够运行:“蟒蛇my_script.py -u名--web_port = XXXX”

我应该如何改变我的代码,以便能够运行这个办法?

谢谢,Arshavski亚历山大。

+0

[python,argparse:启用输入参数时指定另一个]的可能重复(http://stackoverflow.com/questions/11455218/python-argparse-enable-input-parameter-when-another-one-已被指定) – mgilson 2012-08-01 13:46:50

回答

27

而不是让-a-u成为选项,您可能希望使它们成为子命令。然后,使--web-portadd子命令的选项:

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 

你会得到无法识别的说法“升级”的错误,因为你 只定义为“添加”子命令在单个位置参数。

换句话说,子命令隐含地相互排斥。唯一的 小疣是您需要添加“名称”位置参数到每个 分析器。

+0

感谢您的快速响应。但我需要添加和升级为互斥。 – alexarsh 2012-08-01 13:52:51

+1

作为子命令,它们是。例如,'python my_script.py add name --web_port = XXX upgrade'会将'upgrade'作为'add'子命令的位置参数,而不是'upgrade'子命令的调用。 (我想;我有一段时间没有执行子命令。) – chepner 2012-08-01 14:06:04

+1

非常感谢。这就是我需要的。 – alexarsh 2012-08-05 09:52:51