CLI 中的多个上下文对象(单击)
Multiple context objects in CLI (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) # 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
属性,但这意味着要编写大量样板文件。
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:
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)
希望这对您有所帮助。
我正在尝试使用基于 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
标志创建两个不同的对象,并使它们都可用于底层命令,这似乎是不可能的。有什么解决方法吗?
我知道我可以使用 Context 对象的 meta
属性,但这意味着要编写大量样板文件。
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:
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)
希望这对您有所帮助。