2017-08-29 76 views
1

我試圖使用基於Click的Flask CLI基礎結構實現命令行應用程序。它的界面應該像這樣工作:CLI中的多個上下文對象(單擊)

app.py -c config.cfg cmd_a 
app.py -c config.cfg cmd_b 

我有以下代碼:

@click.group 
@click.option('-c', 'config') 
@click.pass_context 
def cli(ctx, config): 
    ctx.obj = ObjA(config) 
    ctx.obj = ObjB(config) # Just for illustration 

@cli.command() 
@click.pass_context() 
def cmd_a(ctx): 
    ctx.find_object(ObjA) 

@cli.command() 
@cli.pass_context() 
def cmd_b(ctx): 
    ctx.find_object(ObjB) 

cli() 

問題是,我需要根據-c標誌創建兩個不同的對象,使他們既提供給底層命令,這似乎是不可能的。有沒有解決方法?

我知道我可以使用Context對象的meta屬性,但這意味着寫了很多樣板。

回答

0

find_object按類型搜索parent context中的對象。如果你想使用多個對象,最簡單的方法是製作obj字典。這裏例如:

@click.group 
@click.option('-c', 'config') 
@click.pass_context 
def cli(ctx, config): 
    if ctx.obj is None: 
     ctx.obj = dict() 
    # add any data to obj here... 
    ctx.obj['a'] = 'example_A' 
    ctx.obj['b'] = 'example_B' 

@cli.command() 
@click.pass_context() 
def cmd_a(ctx): 
    # check prepared data 
    print(ctx.obj['a']) 

@cli.command() 
@cli.pass_context() 
def cmd_b(ctx): 
    # check prepared data 
    print(ctx.obj['b']) 

稍微不同的方式 - 使用自定義類obj

class Config(object): 

    def __init__(self, config): 
     # do something with config here ... 
     self.a = 'example_A' 
     self.b = 'example_B' 

# in your def cli() 
ctx.obj = Config(config) 
# in your commands you can works with your prepared data like this: 
print(ctx.obj.a) 
print(ctx.obj.b) 

希望這有助於。

+1

謝謝!在'obj'中使用自定義類似乎是對我來說最好的方式,儘管它不完全是「純粹的」。哦,還有一點修正 - find_object搜索整個上下文層次結構,而不僅僅是直接的父對象。 – Teyras

+0

我很樂意提供幫助。祝你好運 ; ) –

相關問題