Skip to content

python-dotenv 读取配置

dotenv 可以加载 .env 文件的 KV 值到环境变量。可以使用 os.getenv('xxx') 可以取得对应的值。读取配置很方便。

安装使用

安装(建议在虚拟环境下安装):

bash
pip install python-dotenv

.env 的文件内容,示例如下:

dotenv
user=chenlb
# 可以引用已经定义过的变量。
domain=${user}.com

读取配置:

python
import os

from dotenv import load_dotenv

load_dotenv()
print(os.getenv('domain'))

输出如下:

console
chenlb.com

多个文件可覆盖

场景:多个环境有对应有,开发环境 .env.dev、预发环境 .env.pre、正式环境 .env.prod

想要实现的功能是,在什么环境下创建对应的 .env.* 文件,并取对应的变量值放到文件里。

dotenv
url=http://local.${domain}/
dotenv
url=http://pre.${domain}/
dotenv
url=http://${domain}/

读取配置 python 代码:

python
import os

from dotenv import load_dotenv
from dotenv import dotenv_values

load_dotenv()

config = {
    **dotenv_values('.env'),
    # 调用 load_dotenv() 后,.env.* 可以使用 .env 定义的变量。
    # 有 .env.dev 即加载,可以没有。本地开发:项目目录下 增加 .env.dev 文件。
    **dotenv_values('.env.dev'),
    # 有 .env.pre 即加载,可以没有。预发环境:项目目录下 增加 .env.pre 文件。
    **dotenv_values('.env.pre'),
    # 有 .env.prod 即加载,可以没有。正式环境:项目目录下 增加 .env.prod 文件。
    **dotenv_values('.env.prod')
}

print(config.get('url'))

对应环境创建对应文件,输出如下:

console
http://local.chenlb.com/
console
http://pre.chenlb.com/
console
http://prod.chenlb.com/

使用 pydantic-settings 读配置

使用 pydantic-settings 库后,读取配置可以实例化使用。借助 IDE 工具防止 使用 key 时编写错了。

安装 pydantic-settings

bash
pip install pydantic-settings

使用 pydantic-settings,先创建 config.py

python
from dotenv import load_dotenv
from pydantic_settings import BaseSettings, SettingsConfigDict

# .env.* 文件有引用 .env 的变量需要加。如果没有引用不需要加。
load_dotenv()


class Settings(BaseSettings):
    model_config = SettingsConfigDict(
        # 覆盖链 `.env.prod` -> `.env.pre` -> `.env.dev` -> `.env`
        env_file=('.env', '.env.dev', '.env.pre', '.env.prod')
        , extra='ignore'
    )

    user: str
    domain: str
    url: str


# 创建配置实例
settings = Settings()

使用 config.py 中的配置:

python
from config import settings

print(settings.url)

类似 python-dotenv 配置,读取配置的优先级顺序 .env.prod -> .env.pre -> .env.dev -> .env

在对应环境放 .env.<dev|pre|prod> 文件。

详情,可以看 pydantic-settings 官方说明:dotenv-env-support