2016-01-08 72 views
2

我試圖讓使用argparse比可以解析以下命令的解析器:常見的位置參數

python prog.py update <DOMAIN> <ENVIRONMENT> 
python prog.py pull <DOMAIN> <ENVIRONMENT> 
python prog.py release <DOMAIN> <ENVIRONMENT> 

正如你所看到的,更新發佈採取相同的論點<DOMAIN><ENVIRONMENT>

這三者都是主分析器的子分析器。

我寫了下面:

import argparse 
# create the top-level parser 
parser = argparse.ArgumentParser(prog='PROG', add_help=False) 
parser.add_argument('domain', type=str, help='domain help') 
parser.add_argument('environment', type=str, help='environment help') 

#subparsers 
subparsers = parser.add_subparsers(help='sub-command help', parents=[parser]) 
parser_pull = subparsers.add_parser('pull', help='pull help') 
parser_update = subparsers.add_parser('update', help='update help') 
print parser_pull.parse_args(['pull', 'WEBAPPS', 'DEV']) 
print parser.parse_args(['update', 'WEBAPPS', 'DEV']) 

但似乎環境預期的子命令之前更新發佈,所以它拋出一個錯誤。

如何在子命令後接受這些參數,而不需要在每個子命令中重複代碼?

爲了記錄,我使用Python 2.7。

+0

我不認爲您可以在argparse中執行此操作。您是否嘗試過其他模塊,如[點擊](http://click.pocoo.org/5/),[optparse](https://docs.python.org/2/library/optparse.html)(警告,已棄用)或[docopt](http://docopt.org/)?我知道還有其他人,我不知道你想要什麼是可以實現的,但如果你向第三方圖書館開放,我相信你可以找到一個能夠做到這一點的人。 (我個人喜歡使用點擊,但就像我說過,我不知道它是否會爲你想要的工作) – Dannnno

回答

2

繼續並複製代碼。少許剪切和粘貼並不是那麼多的工作。

位置參數必須以特定順序給出。並且.add_subparsers創建了其中一個定位點(預期值爲'pull','update'),因此子分析命令的順序,爲主語法分析器定義的定位點和子分析器的定位點很重要。 parents機制,這可以節省一些打字,但我不願意推薦它,因爲它可能會導致問題(以前的SO問題證明了這一點)只需咬住子彈並輸入他們所期望的位置參數是最可靠的方法。不要忘記,你可以創建一個循環或輔助功能的子分析器 - 爲另一種保存一種打字。

例如,在創建子分析器之後:

for p in parser_pull, parser_update: 
    p.add_argument('domain', type=str, help='domain help') 
    p.add_argument('environment', type=str, help='environment help')