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

如何将.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:15:03