Argo Python SDK提交工作流时如何传入params.json参数文件
解决方案
Argo官方Python SDK没有封装CLI的-f参数文件读取逻辑,CLI执行argo submit -f params.json时,本质是先读取参数文件内容,将参数合并到工作流清单的spec.arguments.parameters字段后再提交给服务端,SDK没有单独接收params文件的接口参数,你需要手动实现这部分逻辑。
实现步骤
- 读取
params.json的文件内容,得到扁平键值对格式的参数 - 将键值对转换为Argo工作流要求的参数结构:每个参数为
{"name": "参数名", "value": "参数值"}的字典 - 将转换后的参数合并到加载好的workflow manifest中,同名参数直接覆盖,不存在的参数追加;如果manifest原本没有对应的参数层级结构,先初始化避免KeyError
- 将合并完参数的manifest传入
create_workflow接口提交即可
修改后的完整代码
import os import json from pprint import pprint import yaml from pathlib import Path import argo_workflows from argo_workflows.api import workflow_service_api from argo_workflows.model.io_argoproj_workflow_v1alpha1_workflow_create_request import \ IoArgoprojWorkflowV1alpha1WorkflowCreateRequest configuration = argo_workflows.Configuration(host="https://localhost:2746") configuration.verify_ssl = False # 加载工作流清单 with open("workflows/workflow.yaml", "r") as f: manifest = yaml.safe_load(f) # 处理params.json参数 with open("params.json", "r") as f: file_params = json.load(f) # 转换为Argo标准参数格式 params_to_apply = [{"name": k, "value": v} for k, v in file_params.items()] # 初始化manifest参数结构,避免KeyError manifest.setdefault("spec", {}).setdefault("arguments", {}).setdefault("parameters", []) existing_params = manifest["spec"]["arguments"]["parameters"] existing_param_index = {p["name"]: idx for idx, p in enumerate(existing_params)} # 合并参数:同名覆盖,异名追加 for param in params_to_apply: if param["name"] in existing_param_index: existing_params[existing_param_index[param["name"]]]["value"] = param["value"] else: existing_params.append(param) api_client = argo_workflows.ApiClient(configuration) api_instance = workflow_service_api.WorkflowServiceApi(api_client) api_response = api_instance.create_workflow( namespace="argo", body=IoArgoprojWorkflowV1alpha1WorkflowCreateRequest(workflow=manifest, _check_type=False), _check_return_type=False) pprint(api_response)
注意事项
- 上述逻辑和官方CLI的
-f参数行为完全一致:不会提前校验参数是否在工作流中定义,传入的额外参数会随请求提交,工作流运行时未引用的参数会自动忽略 params.json中的非字符串类型值(数字、布尔值等)不需要手动转字符串,SDK序列化时会自动处理为Argo兼容格式
内容的提问来源于stack exchange,提问作者user10283726
相关产品推荐
相关产品推荐

