2015-06-26 49 views
3

基本預期用途:如何有條件地讓蟒蛇的argparse模塊需要額外的參數

my_framework create Project_title /path/to/project

OR

my_framework create Project_title(即用當前的工作目錄)

OR

my_framework update (即更新my_framework而不是創建新項目)

我知道我可以做name可選向其提供一個默認的,但是,在現實中name提供可選用戶輸入create作爲第一個參數。

我想出的最佳解決方案是使用name的默認值,然後如果參數name等於其默認值,則會拋出錯誤。但是,如果有一種方法可以爲我做這個工作,我寧願學會這樣做。

寫兩個腳本,my_framework_createmy_framework_update並不吸引我審美。

#!/usr/bin/env python 


import argparse 
import os 
import shutil 
from subprocess import call 

template_path = "/usr/local/klibs/template" 
parser = argparse.ArgumentParser("MY_FRAMEWORK CLI", description='Creates a new MY_FRAMEWORK project or updates MY_FRAMEWORK') 
parser.add_argument('action', choices=['create', 'update'], type=str, help='<help text>') 
parser.add_argument('name', type=str, help='<help text>') 
parser.add_argument('path', default=os.getcwd(), nargs="?", type=str, help='<help text>') 
args = parser.parse_args() 

if args.action == "create": 
    # do the create stuff 

if args.action == "update": 
    # do the update stuff 
+0

你想用subparsers此:https://docs.python.org/2/library/argparse.html#argparse.ArgumentParser.add_subparsers – Wolph

+0

我不完全理解題。爲什麼使用update調用my_framework時不需要名稱?它不應該總是需要一個名字,以防用戶有兩個框架嗎? –

+0

對不起; 'update'適用於'MY_FRAMEWORK'而不是用它創建的項目(即它基本上檢查github上的新版本,如果找到了它,則將其拉出)。 – Jonline

回答

4

做到這一點,最好的辦法是用subparser

從文檔的一個例子:

>>> parser = argparse.ArgumentParser() 
>>> subparsers = parser.add_subparsers(title='subcommands', 
...         description='valid subcommands', 
...         help='additional help') 
>>> subparsers.add_parser('foo') 
>>> subparsers.add_parser('bar') 
>>> parser.parse_args(['-h']) 
usage: [-h] {foo,bar} ... 

optional arguments: 
    -h, --help show this help message and exit 

subcommands: 
    valid subcommands 

    {foo,bar} additional help 

你的情況,你會createupdate作爲單獨subparsers。

例子:

def create(args): 
    # do the create stuff 
    print(args) 


def update(args): 
    # do the update stuff 
    print(args) 


parser = argparse.ArgumentParser() 
subparsers = parser.add_subparsers(title='subcommands', 
            description='valid subcommands', 
            help='additional help') 

create_parser = subparsers.add_parser('create') 
create_parser.add_argument('name', type=str) 
create_parser.set_defaults(func=create) 

update_parser = subparsers.add_parser('update') 
update_parser.set_defaults(func=update) 
+0

優雅。當'create'是第一個參數時,這會要求subparser的參數,而在進入'update'時忽略其他參數? – Jonline

+1

@Jonline:是的,它會:)當進入'update'時,它會進入第二個分析器,使用'create'將會進入第一個分析器。這應該做你正在尋找一個乾淨的方式:) – Wolph

+0

是的,我現在有這個運行,迷人的解決方案。你的代碼中有兩個小的語法錯誤(試圖編輯但是<6個字符):'update_parser subparsers.add_parser('update')'needs'='並且'setdefaults'都應該是蛇情況。 – Jonline