load_dotenv() 加载环境变量
什么是load_dotenv():
load_dotenv()
的作用是:读取.env
文件中的键值对,把它们加载到操作系统的环境变量(os.environ
)中,以便后续代码通过os.getenv()
能访问到这些配置。
先举个例子,假设你有一个文件叫 .env
:
API_KEY=sk-123456789
BASE_URL=https://api.example.com
DEBUG=true
然后你在 Python 代码中写:
from dotenv import load_dotenv
import osload_dotenv() # ← 就是这一行在“加载”print(os.getenv("API_KEY")) # 输出: sk-123456789
没有这行 load_dotenv()
,os.getenv("API_KEY")
就会返回 None
。
原理详解:它是怎么做到的?
第一步:.env
文件是什么?
.env
是一个纯文本文件- 每一行是
KEY=VALUE
的格式 - 它本身对系统无效,只是一个“配置快照”
系统不会自动读取
.env
文件 —— 必须有程序去解析它。
第二步:load_dotenv()
到底做了什么?
当你调用 load_dotenv()
时,它会:
查找
.env
文件- 默认在当前工作目录找
.env
- 也可以指定路径:
load_dotenv("config/.env")
- 默认在当前工作目录找
逐行读取文件内容
- 打开文件 → 读每一行 → 去掉空格和注释(如
# comment
)
- 打开文件 → 读每一行 → 去掉空格和注释(如
解析每行的
KEY=VALUE
- 用
=
分割字符串 - 处理引号(如
"value with spaces"
) - 支持换行、转义等复杂情况
- 用
设置到
os.environ
中- 把每个变量通过
os.environ['KEY'] = 'value'
设置进去
- 把每个变量通过
核心原理:os.environ
这是 Python 提供的一个特殊字典,代表当前进程的环境变量。
import osos.environ['MY_VAR'] = 'hello'
print(os.getenv('MY_VAR')) # 输出: hello
load_dotenv()
本质上就是批量执行了这种赋值操作。
背后依赖的库:python-dotenv
load_dotenv()
来自一个叫 python-dotenv
的第三方库。
安装方式:
pip install python-dotenv
它的设计哲学是:
“让开发环境像生产环境一样使用环境变量。”
因为在生产环境中,你通常是这样设置变量的:
export API_KEY=sk-xxxxx
python app.py
而在本地开发时,你不想每次都手动输入 export
,所以用 .env
文件代替。
工作流程图解
[.env 文件]↓load_dotenv()↓解析 KEY=VALUE↓写入 os.environ↓其他库(如 LangChain、OpenAI SDK)通过 os.getenv() 读取
例如:
openai_api_key = os.getenv("OPENAI_API_KEY")
注意事项(常见坑)
问题 | 说明 |
---|---|
❌ .env 文件没找到 | 检查路径是否正确,或用 load_dotenv(".env") 明确指定 |
❌ 变量名拼写错误 | .env 中是 APIKEY ,代码里却查 API_KEY → 返回 None |
❌ 没安装 python-dotenv | 会报错 ModuleNotFoundError |
❌ 生产环境也用了 .env 文件 | 不推荐!应使用系统级环境变量 |
❌ 多次调用 load_dotenv() | 后面的会覆盖前面的(除非设置 override=False ) |
安全建议
- 把
.env
加入.gitignore
,防止泄露密钥 - 提供
.env.example
作为模板:# .env.example API_KEY=your_api_key_here BASE_URL=https://...
- 不要把真实密钥提交到 GitHub!
高级用法
# 1. 指定文件路径
load_dotenv("config/secrets.env")# 2. 是否覆盖已存在的环境变量
load_dotenv(override=False) # 默认 True# 3. 从字符串加载(不用文件)
from dotenv import dotenv_values
config = dotenv_values(stream="API_KEY=123\nDB_URL=localhost")
总结
问题 | 回答 |
---|---|
load_dotenv() 是什么? | 是一个函数,用于加载 .env 文件中的配置 |
为什么能被 os.getenv() 读到? | 因为它把变量写进了 os.environ |
原理是什么? | 读文件 → 解析 → 写入环境变量字典 |
是不是“全局生效”? | 只对当前 Python 进程有效,不影响系统 |
必须用吗? | 不是必须,但极大简化本地开发配置管理 |
所以可以理解为:
load_dotenv()
就像是一个“环境变量批量导入器”,让你不用手动一个个export
,特别适合本地开发。