환경 변수와 파이썬 dotenv

환경 변수 Environment Variables

환경 변수는 컴퓨터 운영체제 또는 쉘 차원에서 관리하는 변수로, 환경 변수를 이용하면 서로 다른 프로세스 간에 변수를 공유할 수 있습니다. 환경 변수는 언어, 시간대 같은 시스템 설정, 프로그램의 동작을 변경하는 설정, API 키, 프로그램 경로 등 다양한 목적으로 사용할 수 있습니다. 윈도우즈 운영체제에서는 환경 변수 설정 메뉴를 이용해, 리눅스나 맥OS에서는 쉘에서 export 명령을 이용해 설정할 수 있습니다.

파이썬에서 환경 변수 다루기

파이썬에서는 os 모듈environ 또는 getenv를 사용해 환경 변수에 접근할 수 있습니다.

import os

# 읽기
val = os.environ["MY_VARIABLE"]
val = os.environ.get("MY_VARIABLE")
val = os.getenv("MY_VARIABLE")

# 쓰기
os.environ["MY_VARIABLE"] = val

os.environ을 이용하면 환경 변수를 딕셔너리처럼 다룰 수 있습니다. 존재하지 않는 환경 변수에 접근하려고 하면 에러가 발생합니다. 이 때 get 메소드를 이용하면 변수가 존재하지 않을 때 사용할 default 값을 지정해줄 수 있습니다. 별도로 default 값을 지정하지 않으면 환경 변수가 존재하지 않을 때 None을 반환합니다. os.getenvos.environ.get과 동일하게 동작합니다. 보통 좀 더 간결한 os.getenv를 사용합니다.

os.environ을 이용해 설정한 환경 변수는 현재 실행 중인 프로세스에만 영향을 미치고, 시스템 전체 환경 변수를 변경하지는 않습니다.

Colab에서 환경 변수

API 키와 같은 비밀번호의 경우 코드 내에 저장하는 것은 보안 문제로 인해 보통 추천하지 않습니다. API 키는 환경 변수에 저장하고 사용하는 것이 좋습니다. 하지만, Colab과 같이 직접 환경 변수를 지정하기 어려운 상황도 있습니다. 이런 경우에는 환경 변수에 저장하는 대신 설정 파일에 API 키를 저장해놓고 코드에서 읽어서 쓸 수 있습니다. 파이썬에는 ini, cfg와 같은 설정 파일을 다루는 configparser 모듈이 있습니다. YAML, TOML이나 JSON 파일을 설정 파일로 쓰는 경우도 있습니다. 아래 살펴볼 dotenv 패키지는 설정 파일에서 읽어들인 값을 환경 변수처럼 이용할 수 있도록 만드는 패키지입니다.

dotenv 패키지

dotenv 패키지는 다음과 같이 설치할 수 있습니다.

pip install python-dotenv

Colab 노트북에서 설치하려면 위의 명령 앞에 느낌표(!)를 붙이면 됩니다. 기본 설정 파일은 .env 파일입니다. 파일 내용은 다음과 같이 적습니다.

TEMPERATURE=0.8
OPENAI_API_KEY=sk-my-key

위 변수들은 같은 디렉토리에서 다음의 코드로 읽어들일 수 있습니다.

import os
from dotenv import load_dotenv
load_dotenv()

temperature = float(os.getenv("TEMPERATURE"))
openai_api_key = os.getenv("OPENAI_API_KEY")

만약 .env 파일이 다른 경로에 있다면 load_dotenv(dotenv_path="/path/to/dotenv")와 같이 절대 또는 상대 경로를 넣어주면 됩니다. 이미 동일한 이름의 시스템 환경 변수가 존재하는 경우 .env 파일에 적은 환경 변수는 무시되는데, 시스템 환경 변수를 덮어쓰고 싶으면 override=True 옵션을 주면 됩니다. 단순히 API 키나 변수를 읽어들이는 경우 위의 코드로 충분합니다. 다른 기능이 필요할 경우 여기에서 load_dotenv 함수의 다른 인자와 패키지 내의 다른 함수 설명을 찾을 수 있습니다.

참고로, dotenv로 읽어들인 환경 변수는 모두 문자열(str) 자료형이 됩니다. 따라서 필요할 경우 적절히 형변환을 해서 사용해야 합니다. 불리언 값의 경우 .env 파일에 적은 TRUE, FALSE 값은 파이썬 문자열로 변환된 후 bool("FALSE")와 같이 쓰면 모두 True 값이 되니 주의해야 합니다.

댓글 남기기