Pydantic未优先读取OS环境变量,求无需重启环境的解决方案
问题原因分析
你遇到的核心问题是环境变量名称匹配错误:
- 你的
Config类设置了env_prefix='DEV_',这意味着Pydantic会自动为所有字段的环境变量名添加该前缀,除非字段单独指定env_alias。 - 你给
STAGE字段用了validation_alias='STAGE',这个别名仅用于数据验证时的字段映射,不影响环境变量的查找逻辑。所以Pydantic实际在操作系统中查找的是DEV_STAGE,而非你设置的STAGE,自然读取不到你导出的环境变量,只能使用.env文件中的值。
解决方案
提供两种无需重启环境的解决办法,任选其一即可:
方案1:给STAGE字段指定环境变量别名
修改STAGE字段的配置,将validation_alias替换为env_alias,让Pydantic直接读取操作系统中的STAGE变量(忽略env_prefix):
from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict from devtools import debug class Config(BaseSettings): # Environment STAGE: str = Field('prod', env_alias='STAGE') # 替换为env_alias OTHER: str model_config = SettingsConfigDict(env_file='.test.env', env_file_encoding='utf-8', env_prefix='DEV_') settings = Config() debug(settings)
方案2:带前缀导出环境变量
按照env_prefix的规则,导出带DEV_前缀的环境变量:
export DEV_STAGE=dev
验证效果
修改后运行代码,STAGE的值会优先使用操作系统中设置的dev,而非.env文件中的test,符合Pydantic Settings的优先级规则:操作系统环境变量 > .env文件值 > 默认值。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

