Python如何解析YAML列表并将标签值保存为同名变量
你现有代码的问题是只打印了value.get('tags')的结果,但没有把这个值赋值给tags变量,所以后续遍历for n in tags的时候会出现未定义的错误。
推荐实现方案
不建议直接创建全局同名变量,容易出现变量覆盖、命名冲突问题,优先用字典存储tag和对应值,后续拼接命令更灵活,也不需要硬编码参数名。
完整示例代码
import yaml import subprocess # 加载YAML配置文件 with open("你的配置文件路径.yaml", "r", encoding="utf-8") as f: data = yaml.safe_load(f) # 遍历每个应用配置 for item in data: # 取出当前应用的配置内容 app_config = list(item.values())[0] # 获取当前配置的tags列表、执行脚本路径 tags = app_config.get("tags", []) run_script = app_config.get("run") # 存储tag和对应取值的字典 tag_params = {} # 这里替换为你自己的ES查询逻辑 # resp = es.search(你的查询条件) for doc in resp['hits']['hits']: es_source = doc['_source'] # 从ES查询结果中填充tag对应的值 for tag in tags: tag_params[tag] = es_source.get(tag, "") # 动态拼接命令参数,不需要硬写每个tag的名字 command = [run_script] for param_name, param_value in tag_params.items(): command.extend([f"--{param_name}", str(param_value)]) # 执行命令 p = subprocess.Popen(command, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = p.communicate() # 这里可以加执行结果的处理逻辑
如果你确实需要动态生成同名变量(不推荐)
如果一定要实现“生成和tag同名变量”的需求,可以通过修改全局变量空间实现:
for tag in tags: # 变量名就是tag的值,变量值是从ES查询到的结果 globals()[tag] = es_source.get(tag, "") # 后续可以直接用变量名访问 command = f"{run_script} --age {age} --user {user}"
注意:这种写法会污染全局变量空间,两次遍历的同名tag会互相覆盖取值,仅建议单应用配置场景下使用。
内容的提问来源于stack exchange,提问作者dejanmarich
相关产品推荐
相关产品推荐

