2012-08-01 140 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