Python

[Python] dotenv - .env 파일 읽기

비번변경 2023. 11. 23. 19:29

개요

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