淺析如何使用python dotenv模塊管理環(huán)境變量
在開發(fā)和部署 Python 應(yīng)用程序時(要么是在某個Python環(huán)境,要么是在MaxKB等知識庫系統(tǒng)),我常常需要根據(jù)不同的環(huán)境(如開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境)使用不同的配置信息,或者不想將敏感信息(如數(shù)據(jù)庫連接字符串、API 密鑰等)直接寫在代碼中。這時候,使用環(huán)境變量來管理這些配置信息就顯得非常方便和安全。今天, 田辛老師介紹通過python-dotenv模塊,幫助我們輕松地從文件中讀取環(huán)境變量并在程序中使用。
1. 安裝 python-dotenv 模塊
python-dotenv 模塊不是 Python 標(biāo)準(zhǔn)庫的一部分,所以我們需要先安裝它??梢允褂?pip來進(jìn)行安裝:
pip install python-dotenv
或者在Windows系統(tǒng)中
py -m pip install python-dotenv
2. .env文件的使用
我們通常會在項目根目錄下創(chuàng)建一個名為.env的文件,在這個文件中以鍵=值的形式定義環(huán)境變量。例如:
NAME=田辛
COMPANY=田豆芽
EMAIL=tianxin.xp@gmail.com
API_KEY=sf-XXXXXXXXXX
這個文件中的每一行代表一個環(huán)境變量及其對應(yīng)的值。
2.1. 使用 load_dotenv() 函數(shù)加載環(huán)境變量
要將 .env 文件中的環(huán)境變量加載到程序中,可以使用 load_dotenv() 函數(shù)。這個函數(shù)會自動在當(dāng)前目錄及其父目錄中查找 .env 文件,并將其中定義的環(huán)境變量加載到操作系統(tǒng)的環(huán)境變量中。
from dotenv import load_dotenv load_dotenv()
如果 .env 文件成功加載,load_dotenv() 函數(shù)會返回 True,否則返回 False。我們可以利用這個返回值來判斷是否成功加載了環(huán)境變量:
# 加載環(huán)境變量文件 if load_dotenv(): print(f"{log_time} [INF] 讀取配置文件成功") else: print(f"{log_time} [ERR] 讀取配置文件失敗,請檢查配置文件是否存在或路徑是否正確") raise FileNotFoundError("配置文件不存在或路徑不正確")
2.2. 訪問環(huán)境變量
加載環(huán)境變量后,我們就可以通過 os 模塊來訪問這些變量了。例如:
import os from dotenv import load_dotenv load_dotenv() print(os.getenv('NAME')) # 輸出:田辛 company = os.environ['COMPANY'] print(company ) # 輸出:田豆芽 api_key = os.environ.get('SILICONFLOW_KEY', 'Nothing') # 如果 SILICONFLOW_KEY 未定義,則返回默認(rèn)值 'default' print(api_key ) # 輸出:Nothing
實(shí)際輸出結(jié)果
PS E:\BG10-TRN-AIT-AI編程> & D:/01-Development/Conda/envs/py3.12/python.exe e:/BG10-TRN-AIT-AI編程/src/basic/package-dotenv.py
成功從 .env 文件加載環(huán)境變量
田辛
田豆芽
Nothing
PS E:\BG10-TRN-AIT-AI編程>
說明os.getenv() 和 os.environ.get() 都可以用來獲取環(huán)境變量的值,它們都可以指定一個默認(rèn)值,當(dāng)環(huán)境變量未定義時返回該默認(rèn)值。
3. 檢查環(huán)境變量在操作系統(tǒng)中的設(shè)置
我們可以通過操作系統(tǒng)的命令行來檢查環(huán)境變量是否已經(jīng)設(shè)置。
在 macOS 或 Linux 中可以使用以下命令:
echo $EMAIL
在 Windows 中則可以使用:
echo %EMAIL%
這些命令會輸出對應(yīng)環(huán)境變量的值,如果變量未設(shè)置,則不會有任何輸出。
4. .env 文件的搜索路徑
當(dāng)我們在一個子目錄中調(diào)用 load_dotenv() 函數(shù)時,它會向上級目錄逐層查找 .env 文件。例如,假設(shè)我們在項目根目錄下的 foo/bar/baz 目錄中運(yùn)行程序,load_dotenv() 會依次在 foo/bar/baz、foo/bar、foo 和項目根目錄中查找 .env 文件。
我們也可以通過指定 dotenv_path 參數(shù)來明確指定 .env 文件的路徑:
from pathlib import Path from dotenv import load_dotenv env_path = Path('../../../.env') # 指定 .env 文件的路徑 load_dotenv(dotenv_path=env_path)
5. 覆蓋已存在的環(huán)境變量
默認(rèn)情況下,load_dotenv() 函數(shù)不會覆蓋已經(jīng)存在的環(huán)境變量。如果我們在不同的 .env 文件中定義了相同的環(huán)境變量,只有第一次加載的值會被保留。不過,我們可以通過設(shè)置 override=True 參數(shù)來強(qiáng)制覆蓋已存在的環(huán)境變量:
load_dotenv(dotenv_path=myenv, override=True)
6. 以字典形式讀取環(huán)境變量
除了將環(huán)境變量加載到操作系統(tǒng)中,我們還可以使用 dotenv_values() 函數(shù)將 .env 文件中的內(nèi)容讀取為一個 Python 字典。這在我們不想將環(huán)境變量實(shí)際加載到操作系統(tǒng)中,而只是想在程序內(nèi)部使用這些值時非常有用:
from dotenv import dotenv_values env_vars = dotenv_values() for key, value in env_vars.items(): print(f'{key}: {value}')
這會輸出:
PS E:\BG10-TRN-AIT-AI編程> & D:/01-Development/Conda/envs/py3.12/python.exe e:/BG10-TRN-AIT-AI編程/src/basic/package-dotenv-dotenv_values.py
NAME: 田辛
COMPANY: 田豆芽
EMAIL: tianxin.xp@gmail.com
API_KEY: sf-XXXXXXXXXX
PS E:\BG10-TRN-AIT-AI編程>
總結(jié)
通過使用 python-dotenv 模塊,我們可以很方便地在不同的環(huán)境中管理配置信息,同時避免將敏感信息直接暴露在代碼中。這個模塊提供了簡單易用的接口來加載和使用環(huán)境變量,無論是通過操作系統(tǒng)的環(huán)境變量還是通過 Python 字典,都能滿足我們的需求。在開發(fā)、測試和部署應(yīng)用程序時,合理地利用環(huán)境變量和 python-dotenv 模塊可以幫助我們更好地管理配置,提高代碼的安全性和可維護(hù)性。
完整代碼
目錄結(jié)構(gòu)
.env
NAME=田辛
COMPANY=田豆芽
EMAIL=tianxin.xp@gmail.com
API_KEY=sf-XXXXXXXXXX
package-dotenv-load_dotenv.py
''' 此腳本用于從 .env 文件中加載環(huán)境變量,并打印加載結(jié)果和特定環(huán)境變量的值。 模塊功能: - 嘗試從 .env 文件加載環(huán)境變量。 - 打印環(huán)境變量加載結(jié)果。 - 打印特定環(huán)境變量的值。 ''' import os from dotenv import load_dotenv # 嘗試從 .env 文件加載環(huán)境變量,若成功則返回 True,否則返回 False if load_dotenv(): # 打印環(huán)境變量加載成功的信息 print('成功從 .env 文件加載環(huán)境變量') else: # 打印環(huán)境變量加載失敗的信息 print('未從 .env 文件加載環(huán)境變量') # 使用 os.getenv 方法獲取名為 'NAME' 的環(huán)境變量的值并打印 print(os.getenv('NAME')) # 輸出:田辛 # 使用 os.environ 字典獲取名為 'COMPANY' 的環(huán)境變量的值,并賦值給變量 company company = os.environ['COMPANY'] # 打印變量 company 的值 print(company) # 輸出:bar # 使用 os.environ.get 方法獲取名為 'SILICONFLOW_KEY' 的環(huán)境變量的值,若未定義則返回默認(rèn)值 'Nothing' api_key = os.environ.get('SILICONFLOW_KEY', 'Nothing') # 原注釋中 'BAZ' 可能為筆誤,此處獲取 'SILICONFLOW_KEY' 的值 # 打印變量 api_key 的值 print(api_key) # 輸出:default
package-dotenv-dotenv_values.py
''' 此腳本用于從 .env 文件中加載環(huán)境變量并打印出來。 模塊功能: - 從 .env 文件讀取環(huán)境變量。 - 遍歷并打印所有環(huán)境變量的鍵值對。 ''' # 導(dǎo)入 dotenv 庫中的 dotenv_values 函數(shù),用于讀取 .env 文件中的環(huán)境變量 from dotenv import dotenv_values # 調(diào)用 dotenv_values 函數(shù),將 .env 文件中的環(huán)境變量存儲到字典 env_vars 中 env_vars = dotenv_values() # 遍歷 env_vars 字典,打印每個環(huán)境變量的鍵值對 for key, value in env_vars.items(): # 使用 f-string 格式化輸出鍵值對 print(f'{key}: {value}')
到此這篇關(guān)于淺析如何使用python dotenv模塊管理環(huán)境變量的文章就介紹到這了,更多相關(guān)python dotenv管理環(huán)境變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3 列表,數(shù)組,矩陣的相互轉(zhuǎn)換的方法示例
這篇文章主要介紹了Python3 列表,數(shù)組,矩陣的相互轉(zhuǎn)換的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python socket.error: [Errno 98] Address already in use的原因和解決
這篇文章主要介紹了Python socket.error: [Errno 98] Address already in use的原因和解決方法,在Python的socket編程中可能會經(jīng)常遇到這個問題,需要的朋友可以參考下2014-08-08Python實(shí)現(xiàn)統(tǒng)計給定列表中指定數(shù)字出現(xiàn)次數(shù)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)統(tǒng)計給定列表中指定數(shù)字出現(xiàn)次數(shù)的方法,涉及Python針對列表的簡單遍歷、計算相關(guān)操作技巧,需要的朋友可以參考下2018-04-04如何使用python3獲取當(dāng)前路徑及os.path.dirname的使用
這篇文章主要介紹了如何使用python3獲取當(dāng)前路徑及os.path.dirname的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12python wav模塊獲取采樣率 采樣點(diǎn)聲道量化位數(shù)(實(shí)例代碼)
這篇文章主要介紹了python wav模塊獲取采樣率 采樣點(diǎn)聲道量化位數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01