Python 透過 dotenv 載入環境變數

安裝開發環境,或是架設Flask Web Server時,常常會用到環境變數,當時對其一知半解,而這篇會對環境變數做一個完整的介紹,並用python的dotenv,直接讀取存有環境變數的檔案,就不須每次執行程式前都需要手動載入。

1. 什麼是環境變數?

變數:指的是一個抽屜,裝著某些資料

環境變數:就是在該Terminal內,會有一個Terminal專屬的抽屜,在該Terminal都可以存取的資料,而當Terminal關閉時,所設定的環境變數也會消失

系統環境變數:會有個公開的抽屜,在系統內都可以取用資料,設定後,任何一個Terminal都可以存取。例如每個Terminal打開時,都會有一些指令可以使用,那些指令其實都是對應到一個執行檔,當使用者輸入指令後,Terminal會查詢系統環境變數,並執行對應的執行檔。

1.1 Windows及Ubuntu設定環境變數的方式

以下指令是,設定名為zavier的環境變數,值為talk,並印出zavier這個環境變數,再將zavier設為空值,也就是刪除環境變數,再印出,讀者可以試試看。

Windows:

set zavier=talk

echo %zavier%

set zavier=

echo %zavier%

Ubuntu:

export zavier=talk

echo $zavier

export zavier=

echo $zavier

1.2 為什麼要用環境變數?

經由上述,可以理解環境變數如同程式的變數般,將變數存在Terminal或系統中,讓使用者隨時可以使用,使用環境變數的理由

  1. 便利性: 若將某執行檔加入系統環境變數後,就不需要每次使用時必須切換到該路徑才能執行
  2. 與程式解耦:可以將較隱私性的資料,儲存在Terminal中,這樣一來就不用將密碼或重要資訊等放在程式碼中,可以讓程式讀取環境變數並使用 (有些人會將重要資訊寫在程式碼中,很容易不小心就將重要資訊上傳至Github或是Gitlab,要移除還需費不少功夫)
 

2. Python dotenv 使用方式

根據前一章節的說明後,讀者現在會使用,且也知道為什麼要使用環境變數,但若每次執行程式都要手動設定一次環境變數,實在惱人,所以我們可以將環境變數放在環境檔案中,每次執行程式時透過dotenv讀取環境檔,就不須手動設定。

先在python環境下安裝python-dotenv,安裝完畢後準備一個名為.env的檔案,其中的格式,語法近似於ubuntu的bash語法,儲存了三個變數。

.env

DOMAIN=example.org
ADMIN_EMAIL=admin@${DOMAIN}
ROOT_URL=${DOMAIN}/app

main.py

import os
from dotenv import load_dotenv
# Code of your application, which uses environment variables (e.g. from `os.environ` or
# `os.getenv`) as if they came from the actual environment.
print('Before load_dotenv()', os.getenv('DOMAIN'))
# take environment variables from .env
# You will probably want to add .env to your .gitignore, especially if it contains secrets like a password.
load_dotenv()
print('After load_dotenv()', os.getenv('DOMAIN'))
 

load_dotenv()方法會直接讀取同位置的.env檔案,再透過os.getenv取得對應的環境變數

輸出結果如下,讀取後就得到了DOMAIN環境變數的數值

Before load_dotenv() None
After load_dotenv() example.org

若有另外一個測試用的環境變數 test.env 需要載入

DOMAIN=test.example.org
ADMIN_EMAIL=admin@${DOMAIN}
ROOT_URL=${DOMAIN}/app

可以給定測試檔的路徑,若要覆蓋原本同樣名稱的環境變數,可以設定override為True

# take environment variables from test.env
load_dotenv('test.env', override=True)
print('After load_dotenv(\'test.env\')', os.getenv('DOMAIN'))

結果如下

Before load_dotenv() None
After load_dotenv() example.org
After load_dotenv('test.env') test.example.org

如果只是想將環境變數以dict的格式取得,可以使用dotenv_values

# Load configuration without altering the environment
config = dotenv_values(".env")
print(config)

會將環境變數載入至OrderedDict

OrderedDict([('DOMAIN', 'example.org'), ('ADMIN_EMAIL', '[email protected]'
), ('ROOT_URL', 'example.org/app')])

3. 結論

謝謝各位讀者看到這裡,以上介紹了python的dotenv讀取環境變數檔,可以讓變數與程式解耦,不須手動載入,也可以避免將敏感資料傳到Github上。

當有不同的環境時,例如開發、測試、產品,可以很清楚的紀錄並使用不同的環境變數,在Python Flask 2.0中,也預設當你有安裝python-dotenv時,會自動載入.env檔,之後的Flask系列,也會再次提到。

若你有任何覺得好用的套件或是任何建議,也歡迎您在下方留言告訴我以及分享給其他人唷

若你覺得文章對你很有幫助,歡迎在網頁右方填入你的email訂閱本站唷

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。