Python CLI中的多个上下文对象(单击)

Python CLI中的多个上下文对象(单击),python,command-line-interface,python-click,Python,Command Line Interface,Python Click,我正在尝试使用基于Click的Flask 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) #

我正在尝试使用基于Click的Flask 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
标志创建两个不同的对象,并使它们都可用于底层命令,这似乎是不可能的。有什么解决办法吗


我知道我可以使用上下文对象的
meta
属性,但这意味着要编写大量的样板文件。

find\u object
将按类型搜索对象。如果您想使用多个对象,最简单的方法是制作
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)

希望这有帮助。

谢谢!在
obj
中使用自定义类对我来说似乎是最好的方法,尽管它并不完全“纯粹”。哦,还有一点修正-
find_object
搜索整个上下文层次结构,而不仅仅是直接的父对象。