◾️ python-dotenv
라이브러리 설치
pip install python-dotenv
예제
from dotenv import load_dotenv
import os
def get_environment(env_file:str)-> None:
# Load env_file
load_dotenv(dotenv_path=env_file)
# Get env
env1 : str = os.getnev('env1')
env2 : str = os.getnev('env2')
env_file
env1=TEST1
env2=TEST2
◾️ django-environ
라이브러리 설치
pip install django-environ
예제
import environ
def get_environment(env_file)-> environ.Env:
env : environ.Env = environ.Env(DEBUG=(bool,False))
env.read_env(env_file)
return env
env : environ.Env = get_environment(env_file='.secret.env')
env1 : str = env('env1')
env2 : str = env('env2')
env_file
env1=TEST1
env2=TEST2
◾️ SettingsConfigDict
라이브러리 설치
pip install pydantic-settings
예제에 사용되는 환경변수 파일: .env
IP=192.168.219.162
PORT=25575
예제
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')
IP: str
PORT: int
settings : Settings = Settings()
print(settings.IP) # 출력 192.168.219.162
print(settings.PORT) # 출력 25575
2개의 파일을 로드해야하는 경우
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(
env_file=('.env', '.env.prod'),
env_file_encoding='utf-8')
키워드 인수 override를 사용하여 인스턴스화 키워드 인수인 model_config에 전달하면 pydantic에 파일을 전혀 로드하지 않도록(클래스에 파일이 설정되어 있더라도) 지시할 수 있다.
settings = Settings(_env_file=None)
또한, 각 필드의 속성을 지정 할 수도 있다.
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')
IP : str
PORT : int
PASSWORD : str | None = Field(default=None)
settings : Settings = Settings()
print(settings.IP)
print(settings.PORT)
Field
클래스를 사용하여 필드를 정의하면 Pydantic이 해당 필드에 대해 유효성을 검사하고 필드에 할당된 값의 유형을 강제할 수 있습니다.
◾️ os 내장 모듈
▪️ os.environ
운영체제에 설정되어 있는 모든 환경 변수는 os
모듈의 environ
이라는 속성을 통해서 접근 가능하다.
이 os.environ
속성은 마치 파이썬 내장 자료구조인 사전(dictionary)과 같이 사용할 수 있다.
간단한 예시로, HOME
이라는 환경 벼수에 저장되어 있는 값은 다음과 같이 읽어올 수 있다.
value: str = os.environ['HOME']
print(value)
'/home/server01'
하지만 설정해준 적 없는 환경 변수를 읽어오라고 한다면 어떻게 될까?
value: str = os.environ['error']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<frozen os>", line 679, in __getitem__
KeyError: 'API_KEY'
다음과 같이 KeyError
가 발생하게 된다.
우리가 파이썬을 사용할 때 사전(dictionary)에 존재하지 않는 키를 넘길 경우 KeyError
가 발생하는 경우와 같은 이치라고 생각하면 된다.
따라서 코드를 작성할 때 환경 변수가 존재하지 않는 상황에 대해서도 적당한 예외처리를 해주어야 한다.
이 때, 호출하고자 하는 환경 변수가 없을 때, 오류를 발생시키는 대신 None
을 반환받고 싶은 경우에는 사전과 동일하게 get()
메서드를 사용하면 된다.
value: str | None = os.environ.get('API_KEY') is None
print(type(value))
True
get()
메서드의 두 번째 인자로 기본 값을 넘길 수도 있다. 꼭 설정해주지 않아도 되는 환경 변수에 유용하게 사용된다.
value: str = os.environ.get('API_KEY','aaabbbccc')
print(value)
'aaabbbccc'
▪️ os.getenv
os
모듈의 getenv()
함수를 사용하면 조금 더 간결한 코드로 os.environ.get()
함수와 동일한 효과를 얻을 수 있다.
>>> os.getenv('API_KEY') is None
True
>>> os.getenv('API_KEY', 'aaabbbccc')
'aaabbbccc'