Python使用dotenv讀取環(huán)境變量的示例詳解
在開發(fā) Python 應(yīng)用時,你是否曾遇到過這些問題?
- 數(shù)據(jù)庫密碼、API 密鑰等敏感信息直接寫在代碼里,不小心提交到 GitHub 被公開?
- 開發(fā)、測試、生產(chǎn)環(huán)境需要不同的配置,每次部署都要手動修改代碼?
- 團隊協(xié)作時,每個人的本地配置不同,導(dǎo)致“在我機器上能跑”?
這些問題的根源,往往在于配置與代碼沒有分離。而解決之道,就是使用 環(huán)境變量(Environment Variables) + python-dotenv 工具。
本文將帶你從零開始,系統(tǒng)掌握如何用 python-dotenv 安全、靈活地管理 Python 項目的配置,并重點講解多環(huán)境(開發(fā)/測試/生產(chǎn))下的最佳實踐。
為什么需要環(huán)境變量
環(huán)境變量是操作系統(tǒng)提供的一種鍵值對存儲機制,常用于:
- 存放數(shù)據(jù)庫連接地址、密鑰、第三方服務(wù) Token 等敏感信息
- 控制應(yīng)用行為(如是否開啟調(diào)試模式)
- 實現(xiàn)同一份代碼在不同環(huán)境下運行不同配置
核心原則:配置不屬于代碼,應(yīng)與代碼分離。
- 正確做法:代碼中通過 os.getenv(“DB_URL”) 獲取配置
- 錯誤做法:代碼中硬編碼 DB_URL = “postgres://user:pass@localhost/db”
但問題來了:每次運行程序前,都要手動 export DB_URL=… 嗎?太麻煩!
這時,.env 文件 + python-dotenv 就派上用場了。
什么是 python-dotenv?
python-dotenv 是一個輕量級 Python 包,它的作用是:
自動從項目中的 .env 文件讀取環(huán)境變量,并將其加載到當(dāng)前 Python 進程的環(huán)境變量中。
這樣,你只需維護一個 .env 文件,無需手動設(shè)置系統(tǒng)環(huán)境變量,也無需把敏感信息寫進代碼。
安裝
pip install python-dotenv
基礎(chǔ)用法:創(chuàng)建并加載 .env 文件
1. 項目結(jié)構(gòu)
建議將 .env 放在項目根目錄:
my_app/
├── .env # ← 環(huán)境變量文件(不要提交到 Git?。?br />├── app.py # 主程序
└── .gitignore # 必須忽略 .env
2. 編寫 .env 文件
.env 是純文本文件,格式為 KEY=VALUE,每行一個變量:
# .env DATABASE_URL=postgresql://user:password@localhost/mydb SECRET_KEY=my_super_secret_key_123! DEBUG=True API_TIMEOUT=30
高級語法支持
多行值(用雙引號包裹):
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEA... -----END RSA PRIVATE KEY-----"
變量引用(使用 ${VAR}):
PROJECT_DIR=/home/user/my_app
LOG_PATH=${PROJECT_DIR}/logs
注意:.env 中的值始終是字符串,布爾值或數(shù)字需在代碼中轉(zhuǎn)換。
3. 在 Python 中加載并讀取
# app.py
from dotenv import load_dotenv
import os
# 自動加載 ./.env 文件
load_dotenv()
# 讀取變量
db_url = os.getenv("DATABASE_URL")
secret = os.getenv("SECRET_KEY")
debug = os.getenv("DEBUG", "False").lower() == "true" # 轉(zhuǎn)為布爾值
timeout = int(os.getenv("API_TIMEOUT", "10")) # 轉(zhuǎn)為整數(shù)
print(f"Debug mode: {debug}")
print(f"DB URL: {db_url}")
最佳實踐:始終為 os.getenv() 提供默認值,避免因變量缺失導(dǎo)致崩潰。
安全第一:保護你的 .env 文件
.env 通常包含高度敏感信息,必須做到:
1. 永遠不要提交到版本控制!
在 .gitignore 中加入:
# .gitignore .env .env.local .env.* # 忽略所有 .env 開頭的文件(除非明確需要共享)
2. 團隊協(xié)作怎么辦?
提供一個模板文件,如 .env.example,包含占位符但無真實值:
# .env.example DATABASE_URL=your_database_url_here SECRET_KEY=generate_a_strong_random_key DEBUG=True
新成員復(fù)制該文件為 .env 并填入自己的配置。
重點!多環(huán)境配置管理(開發(fā) / 測試 / 生產(chǎn))
真實項目通常有多個運行環(huán)境,每個環(huán)境需要不同的配置。硬編碼或頻繁修改 .env 顯然不可持續(xù)。
解決方案:使用多個 .env 文件
| 環(huán)境 | 文件名 | 用途說明 |
|---|---|---|
| 共享配置 | .env.shared | 所有環(huán)境通用的非敏感配置 |
| 開發(fā)環(huán)境 | .env.development | 本地開發(fā)使用(如啟用 DEBUG) |
| 測試環(huán)境 | .env.testing | CI/CD 或自動化測試專用 |
| 生產(chǎn)環(huán)境 | .env.production | 線上服務(wù)器使用(高安全要求) |
如何加載指定環(huán)境的配置
你可以根據(jù)當(dāng)前環(huán)境動態(tài)加載對應(yīng)的 .env 文件:
# config.py
import os
from dotenv import load_dotenv, dotenv_values
# 1. 先加載共享配置
load_dotenv(".env.shared")
# 2. 再根據(jù) ENV 環(huán)境變量加載特定配置
env = os.getenv("ENV", "development") # 默認為開發(fā)環(huán)境
if env == "production":
load_dotenv(".env.production", override=True)
elif env == "testing":
load_dotenv(".env.testing", override=True)
else:
load_dotenv(".env.development", override=True)
# 現(xiàn)在 os.getenv() 可獲取最終合并后的變量
關(guān)鍵參數(shù):override=True 表示新加載的變量會覆蓋已存在的同名變量。
啟動應(yīng)用時指定環(huán)境
# 開發(fā) ENV=development python app.py # 生產(chǎn) ENV=production gunicorn app:app
更高級方案:使用 dotenv_values 返回字典(不污染全局環(huán)境)
如果你不想修改全局 os.environ(例如在單元測試中),可以用 dotenv_values:
from dotenv import dotenv_values
# 合并多個配置文件
shared = dotenv_values(".env.shared")
dev = dotenv_values(".env.development")
config = {**shared, **dev} # 后者覆蓋前者
print(config["DATABASE_URL"])
這種方式更可控,適合復(fù)雜場景。
常見問題與最佳實踐
Q1: .env 和系統(tǒng)環(huán)境變量沖突怎么辦?
A: load_dotenv(override=False)(默認)不會覆蓋已存在的系統(tǒng)變量;設(shè)為 True 則會覆蓋。建議優(yōu)先使用系統(tǒng)變量,.env 僅作開發(fā)時的默認值。
Q2: 如何驗證變量是否加載成功?
A: 打印 os.environ 的子集,或使用日志記錄關(guān)鍵配置(注意:不要打印敏感值?。?。
總結(jié)
| 能力 | 說明 |
|---|---|
| 安全隔離 | 敏感信息不出現(xiàn)在代碼中 |
| 靈活配置 | 一套代碼,多套配置 |
| 團隊友好 | 通過 .env.example 統(tǒng)一規(guī)范 |
| 多環(huán)境支持 | 開發(fā)/測試/生產(chǎn)無縫切換 |
| 簡單易用 | 3 行代碼即可集成 |
python-dotenv 雖小,卻是現(xiàn)代 Python 開發(fā)不可或缺的工具。它讓你的項目更安全、可維護、可部署。
到此這篇關(guān)于Python使用dotenv讀取環(huán)境變量的示例詳解的文章就介紹到這了,更多相關(guān)Python dotenv讀取環(huán)境變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Django+uwsgi+Nginx上線最佳實戰(zhàn)
這篇文章主要介紹了Django+uwsgi+Nginx上線最佳實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
python獲取當(dāng)前計算機cpu數(shù)量的方法
這篇文章主要介紹了python獲取當(dāng)前計算機cpu數(shù)量的方法,涉及Python操作計算機硬件的技巧,代碼簡單易懂,非常具有實用價值,需要的朋友可以參考下2015-04-04
Python中的?Numpy?數(shù)組形狀改變及索引切片
這篇文章主要介紹了Python中的?Numpy?數(shù)組形狀改變及索引切片,Numpy提供了一個reshape()方法,它可以改變數(shù)組的形狀,返回一個新的數(shù)組,更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章2022-05-05
Python實現(xiàn)將MySQL中所有表的數(shù)據(jù)都導(dǎo)出為CSV文件并壓縮
這篇文章主要為大家詳細介紹了如何使用Python將MySQL數(shù)據(jù)庫中所有表的數(shù)據(jù)都導(dǎo)出為CSV文件到一個目錄,并壓縮為zip文件到另一個目錄下,需要的可以了解下2025-03-03

