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