从 Python 代码中启动 Click CLI 应用程序

问题描述 投票:0回答:2

我想将使用 click 编写的 python CLI 集成到使用另一个框架构建的 python CLI 应用程序中。重写调用应用程序不是一种选择。

作为集成的一部分,我需要从代码中调用 click CLI,传递它应该直接使用的参数。我该怎么做?

举一个具体的例子,假设我将其调用为

foobar theclickcli <args>
,其中
foobar
是未在 click 中编写的 CLI,而
theclickcli
是一个子命令,它应该使用其参数调用我的 click CLI (
<args>
)。

我看到 click 提供了

click.testing.CLIRunner
类,它允许调用组或命令。但是,文档指出:

“...[this] 真的应该只用于测试,因为它们为简单起见改变了整个解释器状态,并且在任何方面都不是线程安全的”。

在给定 argparse 中的

argv
参数列表的情况下,是否有调用 click CLI(不仅仅是子命令)的“惯用”方式?

python click python-click
2个回答
0
投票

这取决于您需要在两个应用程序之间集成的度量。如果您不需要共享内部变量和状态,一种选择是简单地调用 click CLI 应用程序作为主应用程序的子进程,而不是在同一个 python 进程中运行它的所有代码。

举个例子:

import subprocess

def run_click_cli_app(vargs):
    subprocess.run(["theclickcli.py", *vargs], shell=True, stderr=subprocess.STDOUT, check=True)

在这里,您可以根据所需的标准输入/标准输出/标准错误行为修改参数或

run()
,检查
theclickcli
的退出代码或使用
subprocess.Popen()
进行更多控制。


-1
投票

您可以手动创建一个新的 Context 对象并使用 Context.invoke() 方法调用命令。 例子:

import click

@click.command()
@click.option('--name', default='World', help='Who to greet')
def hello(name):
    click.echo(f'Hello, {name}!')

def invoke_click_command(args):
    ctx = click.Context(hello)
    ctx.invoke(hello, args=args)
© www.soinside.com 2019 - 2024. All rights reserved.