Python-env变量读取
Python-env变量读取
记录Python进行环境变量的读取->最佳实践【dotenv】+【os】

1-知识整理
-
1)使用python自带的os进行【环境变量】读取
import os home = os.getenv('OPEN_API_KEY') print(home, path) -
2)使用python-dotenv
# 依赖安装 pip install python-dotenv# 代码逻辑 from pathlib import Path from dotenv import load_dotenv import os# 使用dotenv读取配置文件的配置到环境变量 load_dotenv(Path(__file__).resolve().parent / ".env") # 显式给路径,避免找不到# 再使用os进行环境变量读取 OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") DEBUG = os.getenv("DEBUG", "false").lower() == "true"
2-参考网址
- 【阿里百炼】linux/macos/windows不同的配置参考:https://bailian.console.aliyun.com/?spm=5176.29619931.J__Z58Z6CX7MY__Ll8p1ZOR.1.38fe521cU3isvj&tab=api#/api/?type=model&url=2803795

3-知识详解
1-os读取环境变量
在 Python 里,os.getenv 是标准库 os 提供的最常用、最安全的“读环境变量”接口。
它只做一件事:到当前进程的环境变量表里找指定名字,找到了就返回字符串,找不到就返回 None(或你指定的默认值)。
1. 基本用法
import os# 读取单个变量
home = os.getenv('HOME') # Linux/macOS 例子
path = os.getenv('PATH') # 所有系统都有
print(home, path)# 变量不存在时避免 None
port = os.getenv('APP_PORT', '8000') # 没配就默认 8000
debug = os.getenv('DEBUG', '').lower() in ('1', 'true', 'yes')
2. 与 os.environ 的区别
| 特性 | os.getenv(key, default) | os.environ[key] |
|---|---|---|
| 找不到时 | 返回 default / None | 抛 KeyError |
| 类型 | 函数调用 | 类似 dict 的映射 |
| 能否改值 | 只读 | 可写:os.environ['x']='y' |
| 线程安全 | 是 | 是(但改值需加锁) |
90% 的场景用
os.getenv就够了;只有需要“强制必须存在”或需要修改时才用os.environ。
3. 常见踩坑
- 大小写敏感
Windows 在系统层面不区分大小写,但os.getenv内部仍区分;建议统一大写。 - 子进程隔离
在代码里os.environ['X']='y'只会影响当前进程及其后续子进程,不会影响调用你的 shell。 - PyCharm / VS Code 终端
在 IDE 里运行脚本时,IDE 会重新加载环境;如果改完.bashrc要重启 IDE 或重新打开终端。 - Docker / systemd
容器或 service 文件里写ENV KEY=value才是运行时可见;构建阶段的ENV对运行时也有效,但ARG无效。
4. 批量读取(可选技巧)
from typing import Dictdef envmap(*keys: str, **defaults: str) -> Dict[str, str]:"""一次性取多个变量,支持默认值"""return {k: os.getenv(k, defaults.get(k, '')) for k in keys}cfg = envmap('DB_HOST', 'DB_PORT', 'DB_USER', DB_PASSWORD='secret')
5. 完整示例:小型配置模块
# config.py
import osclass Config:# 数据库DB_HOST = os.getenv('DB_HOST', '127.0.0.1')DB_PORT = int(os.getenv('DB_PORT', '5432'))DB_USER = os.getenv('DB_USER', 'postgres')DB_PASS = os.getenv('DB_PASSWORD') # 必须显式配置if DB_PASS is None:raise RuntimeError('环境变量 DB_PASSWORD 未设置')# 业务DEBUG = os.getenv('DEBUG', '').lower() == 'true'LOG_LVL = 'DEBUG' if DEBUG else 'INFO'# 其他文件
# from config import Config
# print(Config.DB_HOST)
6. 一句话总结
value = os.getenv('KEY', '默认值')
记住:
“读用 getenv,写用 environ,找不到就抛错用 environ[key],其余场景全用 getenv 最安全。”
2-dotenv读取业务参数
在 Python 里“管理”API_KEY 这类敏感环境变量,核心就三件事:
- 永远不把明文写进源码;
- 运行时能“无感”读到;
- 不同机器/部署阶段切换方便。
下面给出一条“从开发到上线”的常用路线,按推荐程度排序,你按需取用即可。
- 本地开发:.env 文件 + python-dotenv(最简单)
-
安装
pip install python-dotenv -
项目根目录建一个
.env文件(记得.gitignore里加一行.env)OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx DEBUG=true -
代码里一次性加载
# settings.py from pathlib import Path from dotenv import load_dotenv import osload_dotenv(Path(__file__).resolve().parent / ".env") # 显式给路径,避免找不到OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") DEBUG = os.getenv("DEBUG", "false").lower() == "true" -
其他模块直接
from settings import OPENAI_API_KEY即可。
换电脑只需复制.env,不用改代码。
- 多环境/容器:shell 环境变量优先
-
本地
export OPENAI_API_KEY=sk-xxx即可覆盖.env里的值,方便临时调试。 -
Docker / docker-compose 里写:
# docker-compose.yml services:app:environment:- OPENAI_API_KEY=${OPENAI_API_KEY} # 从宿主机继承 -
Kubernetes、GitHub Actions、Vercel、Heroku 等都提供 UI 或 CLI 注入环境变量,
原理一样:启动前由平台把变量写进容器进程的环境,代码里os.getenv就能读到。
- 生产加密:托管机密服务(可选)
- AWS → AWS Secrets Manager / Parameter Store
- GCP → Secret Manager
- Azure → Key Vault
官方 SDK 都支持 client.get_secret("OPENAI_API_KEY"),
配合 IAM 角色,服务器无需在本地落盘任何明文。
代价是增加一次网络请求和 IAM 配置,适合对合规要求高的场景。
- 常见坑
- 把
.env误提交到 GitHub → 立刻轮换密钥,用git-filter-repo清历史。 - Windows PowerShell 设置变量用
$Env:OPENAI_API_KEY="sk-xxx",不是export。 os.environ["OPENAI_API_KEY"]在变量不存在时会抛KeyError,
用os.getenv("OPENAI_API_KEY")更稳,可给默认值。- Jupyter / VS Code 重启内核后环境变量会刷新,
如果.env改了要load_dotenv(override=True)或重启内核。
- 一句话总结
开发阶段用 .env + python-dotenv,
上线后让平台把变量注进进程环境,
代码里永远只通过 os.getenv 读取,
这样本地、CI、生产都能无痛切换,也永远不会把密钥写进仓库。
