想通了。我必须传递一个上下文并从那里调用它,而不是仅仅调用一个函数:
@cli.command()
@click.pass_context
def run():
for namespace in KEYS.iterkeys():
ctx.invoke(process, namespace=namespace)
从文档:
有时,从另一个命令调用一个命令可能会很有趣。这是 Click 通常不鼓励使用的模式,但仍有可能。为此,您可以使用 Context.invoke() 或 Context.forward() 方法。
它们的工作方式类似,但不同之处在于 Context.invoke() 仅使用您作为调用者提供的参数调用另一个命令,而 Context.forward() 填充来自当前命令的参数。两者都接受命令作为第一个参数,其他所有内容都按照您的预期继续传递。
例子:
cli = click.Group()
@cli.command()
@click.option('--count', default=1)
def test(count):
click.echo('Count: %d' % count)
@cli.command()
@click.option('--count', default=1)
@click.pass_context
def dist(ctx, count):
ctx.forward(test)
ctx.invoke(test, count=42)
它是什么样子的:
$ cli dist
Count: 1
Count: 42