如何将.env中的环境变量值导入YAML文件并在Python中正确解析
问题解决方法
原生PyYAML默认不支持自动解析${}格式的环境变量占位符,同时.env文件中的变量不会自动加载到当前进程的环境变量中,需要手动完成两个环节的处理:加载.env文件变量、自定义YAML解析逻辑替换占位符。
1 安装依赖
需要用到两个第三方库:
pyyaml:用于解析YAML文件python-dotenv:用于加载.env文件中的变量到环境变量
执行安装命令:
pip install pyyaml python-dotenv
2 完整实现代码
import os import re import yaml from dotenv import load_dotenv # 第一步:加载.env文件中的变量到当前进程的环境变量 # 如果.env文件不在当前工作目录,需要传入完整路径,比如load_dotenv("/xxx/.env") load_dotenv() # 第二步:自定义YAML构造器,自动替换${变量名}格式的占位符 env_pattern = re.compile(r"\$\{(\w+)\}") def env_var_constructor(loader, node): raw_value = loader.construct_scalar(node) # 替换所有匹配到的环境变量占位符 def replace(match_obj): var_name = match_obj.group(1) # 如果环境变量不存在则返回原占位符,也可以自定义抛出异常 return os.getenv(var_name, match_obj.group(0)) return env_pattern.sub(replace, raw_value) # 给安全加载器注册自定义构造器,对所有字符串类型的内容做替换 yaml.add_constructor("tag:yaml.org,2002:str", env_var_constructor, Loader=yaml.SafeLoader) # 第三步:加载YAML配置文件 with open("你的YAML文件路径.yaml", "r", encoding="utf-8") as f: config = yaml.safe_load(f) # 验证结果 login = config["Website"]["USER"]["Login"] passwd = config["Website"]["USER"]["Pass"] print(f"Login = {login}") print(f"Pass = {passwd}")
替代方案:加载后遍历替换
如果不想修改YAML全局加载规则,也可以在加载完YAML得到原始字典后,递归遍历所有值替换占位符:
# 加载完原始配置后执行替换 def replace_env_vars(value): if isinstance(value, str): return env_pattern.sub(lambda m: os.getenv(m.group(1), m.group(0)), value) elif isinstance(value, dict): return {k: replace_env_vars(v) for k, v in value.items()} elif isinstance(value, list): return [replace_env_vars(item) for item in value] else: return value # 用法 with open("你的YAML文件路径.yaml", "r", encoding="utf-8") as f: raw_config = yaml.safe_load(f) config = replace_env_vars(raw_config)
内容的提问来源于stack exchange,提问作者swarna
相关产品推荐
相关产品推荐

