如何在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
相关产品推荐
相关产品推荐

