You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Typer中传递所有参数给外部命令?

实现Typer命令直接传递所有参数给Docker中的外部命令

要实现无需显式定义参数,直接将所有输入参数传递给Docker镜像中的外部命令,可以通过Typer上下文获取原始命令行参数,结合subprocess执行Docker命令完成。

步骤1:编写banana.py的命令逻辑

在banana.py中完成参数捕获与Docker命令执行:

import typer
import subprocess

app = typer.Typer()

@app.command(context_settings={"ignore_unknown_options": True})
def default(ctx: typer.Context):
    # 提取子命令后所有用户输入的参数
    try:
        # 定位子命令名"banana"的位置,后续即为要传递的参数
        cmd_index = ctx.raw_args.index("banana") + 1
        pass_args = ctx.raw_args[cmd_index:]
    except ValueError:
        pass_args = []

    # 构造Docker命令,替换为你的实际镜像名称
    docker_cmd = ["docker", "run", "--rm", "your-banana-image"] + pass_args

    # 执行命令并保持终端交互性
    try:
        subprocess.run(
            docker_cmd,
            check=True,
            stdin=subprocess.STDOUT,
            stdout=subprocess.STDOUT,
            stderr=subprocess.STDOUT
        )
    except subprocess.CalledProcessError as e:
        typer.echo(f"外部命令执行失败,退出码: {e.returncode}", err=True)
        raise typer.Exit(code=e.returncode)

步骤2:保持mycli.py的原有结构

主CLI文件无需修改,维持子命令注册逻辑:

import typer
from banana import app as banana_app

app = typer.Typer()
app.add_typer(banana_app, name="banana", help="Run the banana command")

if __name__ == "__main__":
    app()

关键说明

  • context_settings={"ignore_unknown_options": True}:让Typer忽略无法识别的外部命令参数,避免抛出解析错误。
  • ctx.raw_args:获取完整原始命令行参数列表,通过定位子命令名提取后续参数,确保所有输入都能传递给外部命令。
  • subprocess.run参数配置:保持终端输入输出交互,让Docker容器中的外部命令行为与直接调用一致。

测试示例

  • 无参数调用:执行mycli banana,会运行docker run --rm your-banana-image,触发外部命令的默认行为。
  • 带参数调用:执行mycli banana --verbose --input data.txt,会运行docker run --rm your-banana-image --verbose --input data.txt,将所有参数完整传递给镜像中的外部命令。

内容的提问来源于stack exchange,提问作者Dawngerpony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:37:49