개요
Airflow 프로세스를 동작시킬 때 KEY=VALUE 형태로 정의된 환경 변수 파일에 적절한 값을 저장/로드하여 사용하는데, 해당 값을 Python으로도 사용하려고 한다.
확인해보니 .env 파일로부터 키-값 형식의 값을 읽어 환경 변수로 설정할 때는 python-dotenv라는 패키지를 사용하는 것 같다.
패키지 사용 방법을 정리해둔다.
python-dotenv 설치
python-dotenv는 기본 내장 패키지가 아니기 때문에 별도 설치가 필요하다.
pip install python-dotenv
모듈 임포트
사용 사례에 따라서 다음과 같이 import 하여 사용한다.
from dotenv import load_dotenv # 환경 변수로 설정
from dotenv import dotenv_values # 파싱한 값 반환
.env 파일을 읽어 환경 변수로 설정
간단하게 아래와 같은 DB 접근 정보를 .env 파일에 저장하여 사용해본다.
ENV_BACKEND_HOST=idb.c01jlvq0000q.ap-northeast-2.rds.amazonaws.com
ENV_BACKEND_PORT=3306
ENV_BACKEND_USER=master
ENV_BACKEND_PASSWORD=PASSWD
ENV_BACKEND_DATABASE=DB_NAME
작성한 .env 파일을 읽어들이고 값을 환경 변수로 설정할 때는 load_dotenv() 함수를 사용한다. 기본적으로 프로젝트 루트에 저장된 .env 파일을 읽으며, 로드한 값은 os.eviron 객체 또는 os.getenv 함수로 접근할 수 있다.
from dotenv import load_dotenv
load_dotenv()
print('ENV_BACKEND_USER', os.environ['ENV_BACKEND_USER'])
print('ENV_BACKEND_PORT', os.getenv('ENV_BACKEND_PORT'))
만약 다른 경로에 .env 파일이 저장되어 있으면 함수에 파일 경로를 지정해주면 된다. 그외 매개변수는 다음과 같다.
def load_dotenv(
dotenv_path: Optional[StrPath] = None,
stream: Optional[IO[str]] = None,
verbose: bool = False,
override: bool = False,
interpolate: bool = True,
encoding: Optional[str] = "utf-8",
)
- dotenv_path: .env 파일이 저장된 절대 경로 또는 상대 경로.
- stream: .env 값이 저장된 스트림 객체
- verbose : .env 파일 누락 등의 경고 출력 여부
- override : 시스템 환경 변수를 .env에 정의한 환경 변수로 덮어쓸 건지에 대한 옵션
- encoding: 인코딩 방식
.env 파일을 읽은 값 반환
작성한 .env 파일을 읽어들여서 딕셔너리 형태로 변수에 저장할 때는 dotenv_values 함수를 사용한다. load_dotenv 함수와 비슷하게 동작하지만 환경 변수로 설정하지 않는다는 점이 다르다.
from dotenv import load_dotenv, dotenv_values
conf = dotenv_values('/path/env/file')
print(conf['ENV_BACKEND_USER'])
여러 파일을 하나의 객체로 저장할 때는 다음과 같은 방식으로 처리할 수 있다.
import os
from dotenv import dotenv_values
config = {
**dotenv_values(".env.shared"), # load shared development variables
**dotenv_values(".env.secret"), # load sensitive variables
**os.environ, # override loaded values with environment variables
}
참고 문서
https://pypi.org/project/python-dotenv/
https://github.com/theskumar/python-dotenv