파이썬에서 환경 변수 사용법: 완벽 가이드
프로젝트 설정을 효율적으로 관리하고 싶으신가요? 파이썬에서 환경 변수를 활용하는 방법을 자세히 알아보세요.
개인적으로 파이썬을 독학할 때, 습득한 지식을 곧바로 적용하는 프로젝트를 진행했습니다. 그중 하나가 데이터베이스와 연결하고 파이썬을 이용해 쿼리하는 작업이었죠. 이 과정에서 인증을 위해 데이터베이스 설정, 사용자 이름, 비밀번호와 같은 중요한 정보를 저장해야 했습니다.
파이썬 스크립트에 이러한 민감한 정보를 직접 코딩하는 것은 보안상 매우 위험합니다. 대신, 환경 변수와 설정 파일을 파이썬의 내장 모듈과 함께 사용하는 방법을 배우게 되었습니다.
애플리케이션에서 비밀번호나 API 키와 같은 중요한 정보를 사용해야 할 때는 항상 환경 변수로 설정하고 필요할 때마다 가져옵니다. 본 튜토리얼에서는 환경 변수의 개념과 파이썬에서 환경 변수를 사용하는 방법을 자세히 설명합니다.
환경 변수란 무엇인가?
환경 변수는 애플리케이션 외부에서 설정 정보를 저장하는 데 사용되는 변수입니다. 주로 운영 체제나 애플리케이션 환경에서 관리되며, 다음과 같은 특징을 갖습니다.
- 이름-값 쌍: 각 환경 변수는 이름(키)과 그에 해당하는 값으로 이루어져 있습니다.
- 시스템 범위: 환경 변수는 시스템 수준에서 설정하여 시스템에서 실행되는 모든 프로세스에서 접근할 수 있도록 할 수 있습니다. 필요에 따라 애플리케이션 수준에서 수정하거나 정의하여 특정 애플리케이션에만 적용할 수도 있습니다.
- 동적 및 변경 가능: 환경 변수는 프로그램 실행 중에 변경할 수 있어 유연성을 제공합니다.
환경 변수의 유용성
환경 변수는 파이썬 애플리케이션에서 설정 정보와 중요한 데이터를 관리하는 데 있어 다양한 이점을 제공합니다.
- 관심사 분리: 설정을 코드 외부에 저장함으로써 설정 관리 문제를 애플리케이션 로직과 분리할 수 있습니다.
- 보안 강화: API 키, 데이터베이스 인증 정보와 같은 중요한 데이터를 소스 코드에 직접 노출하지 않고 환경 변수에 저장하여 보안 위험을 줄일 수 있습니다.
- 유연성 향상: 환경 변수를 사용하면 코드 수정 없이 설정을 업데이트하거나 변경할 수 있어 설정 관리가 편리해집니다. 이는 다양한 환경에 애플리케이션을 배포하거나 인증 정보를 업데이트할 때 특히 유용합니다.
본 튜토리얼의 다음 섹션에서는 파이썬에서 환경 변수를 설정, 접근, 관리하는 방법과 프로젝트의 설정 관리를 향상시키는 방법을 살펴보겠습니다.
환경 변수 설정 방법
명령줄을 사용하여 환경 변수를 설정할 수 있습니다. 이러한 환경 변수는 현재 세션에만 적용되며 세션이 종료되면 사라집니다.
맥(Mac) 또는 리눅스(Linux) 시스템을 사용하는 경우, 현재 터미널 세션에서 다음과 같이 환경 변수를 설정할 수 있습니다.
export MY_VARIABLE=my_value
윈도우(Windows) 사용자의 경우, 다음과 같이 임시로 환경 변수를 설정할 수 있습니다.
set MY_VARIABLE=my_value
파이썬에서 환경 변수 접근
파이썬은 운영 체제 관련 기능을 위한 os 모듈을 제공합니다. 여기서 `os.environ`은 환경 변수들을 담은 사전입니다. 환경 변수의 이름과 값은 각각 사전의 키와 값으로 표현됩니다.
따라서 사전에 접근하는 것처럼 키(이름)를 이용하여 환경 변수의 값에 접근할 수 있습니다.
몇 가지 예시를 살펴보겠습니다.
import os print(os.environ['HOME']) # 출력: /home/balapriya
print(os.environ['USER']) # 출력: balapriya
지금까지는 괜찮습니다. 하지만 만약 설정되지 않은 환경 변수에 접근하려고 하면 어떻게 될까요?
아직 설정하지 않은 API_KEY에 접근해 보겠습니다.
print(os.environ['API_KEY'])
예상대로 `KeyError`가 발생합니다.
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<frozen os>", line 679, in __getitem__ KeyError: 'API_KEY'
KeyError 처리
다음과 같이 `KeyError`를 처리할 수 있습니다.
import os
try:
api_key = os.environ['API_KEY']
print(f'API_KEY is set to: {api_key}')
except KeyError:
print('API_KEY가 설정되지 않았습니다. 설정해주세요.')
이 방법을 사용하면 `KeyError` 예외가 발생해도 프로그램이 갑자기 중단되지 않고, 사용자에게 오류 메시지를 보여줍니다.
# 출력 API_KEY가 설정되지 않았습니다. 설정해주세요.
따라서 프로그램의 다른 부분이 예상대로 실행되지 않을 때 필수 환경 변수 설정을 빠뜨렸다는 것을 인지할 수 있습니다.
get() 메서드를 사용하여 환경 변수에 접근
사전의 `get()` 메서드를 사용하여 환경 변수의 값을 가져올 수도 있습니다. `get()` 메서드는 변수를 찾을 수 없는 경우 `KeyError` 대신 `None`을 반환합니다.
설정하지 않은 `NOT_SET` 변수에 접근하면 `None`이 반환됩니다.
print(os.environ.get('NOT_SET'))
# 출력: None
환경 변수가 설정되지 않은 경우 키 오류를 처리하는 것을 선호할 수 있습니다. 이 경우, `get()` 메서드가 반환하는 `None` 값 대신 `KeyError`를 발생시켜 알림을 받는 것이 더 효과적입니다.
하지만 `get()` 메서드는 특정 환경 변수가 설정되지 않은 경우 기본값을 제공할 수 있다는 장점이 있습니다.
예시를 보겠습니다.
print(os.environ.get('HOME','/home/user'))
# 출력: /home/balapriya
환경 변수를 이용한 설정 관리
이제 애플리케이션에서 환경 변수를 사용하는 몇 가지 실제 예시를 살펴보겠습니다.
예시 1: 데이터베이스 연결 설정

파이썬에서 PostgreSQL 데이터베이스에 연결하고 싶다고 가정해 보겠습니다. 이를 위해서는 `psycopg2` 커넥터를 설치하고 사용할 수 있습니다.
pip install psycopg2
이 예시에서는 환경 변수를 사용하여 데이터베이스 연결 설정을 구성합니다. 환경 변수가 설정되지 않은 경우 사용할 기본값을 지정합니다.
import os
import psycopg2
# 환경 변수에서 데이터베이스 설정 가져오기
db_host = os.environ.get('DB_HOST', 'localhost')
db_port = os.environ.get('DB_PORT', '5432')
db_user = os.environ.get('DB_USER', 'myuser')
db_password = os.environ.get('DB_PASSWORD', 'mypassword')
# 데이터베이스 연결 설정
try:
connection = psycopg2.connect(
host=db_host,
port=db_port,
user=db_user,
password=db_password,
database="mydb"
)
print('데이터베이스에 연결되었습니다!')
except Exception as e:
print(f'데이터베이스 연결 오류: {e}')
예시 2: API 키 관리
API 키 사용과 관련된 또 다른 예시를 살펴보겠습니다.
ChatGPT 인터페이스 외에도 OpenAI API를 사용하여 애플리케이션에서 OpenAI LLM을 지원할 수 있습니다.
OpenAI 계정에 가입하면 (일반적으로) 시간 제한이 있는 무료 API 크레딧을 받을 수 있습니다. 설정 > API 키 보기로 이동하여 API 키를 발급받으세요.
Open AI 파이썬 SDK와 LangChain과 같은 프레임워크를 사용하여 애플리케이션을 구축할 수 있습니다. 이를 위해서는 `pip`를 사용하여 가상 환경에 필요한 라이브러리를 설치해야 합니다.
pip install openai pip install langchain
다음은 `OPENAI_API_KEY`를 환경 변수로 설정하는 방법입니다.
import os os.environ["OPENAI_API_KEY"]='your-api-key'
이제 다음과 같이 스크립트에서 Open AI LLM에 접근할 수 있습니다.
from langchain.llms import OpenAI model=OpenAI(model_name="gpt-3.5-turbo")
파이썬에서 환경 변수 수정
`os` 모듈의 `os.environ` 사전을 활용하여 현재 파이썬 프로세스 내에서 환경 변수를 수정할 수 있습니다.
import os # 기존 환경 변수 수정 또는 새로운 변수 생성 os.environ['MY_VARIABLE'] = 'new_value'
파이썬에서는 subprocess 모듈을 사용하여 기존 파이썬 스크립트에서 하위 프로세스를 생성할 수 있습니다. 이는 파이썬에서 시스템 프로그램을 실행하려는 경우에 유용합니다.
다음 예시에서는 `os.environ` 사전을 이용하여 `PATH` 환경 변수를 수정하고, `echo $PATH` 명령을 하위 프로세스로 실행합니다.
import os
import subprocess
# 하위 프로세스를 위한 사용자 지정 환경 변수 설정
os.environ['PATH'] = '/custom/path'
# PATH 환경 변수에 접근하는 하위 프로세스 실행
result = subprocess.run("echo $PATH", shell=True, stdout=subprocess.PIPE)
output = result.stdout.decode()
print(output)
print(f'하위 프로세스 출력: {output}')
결과를 보면 `PATH`가 `/custom/path` 값을 사용하는 것을 확인할 수 있습니다.
# 출력 /custom/path
수정된 환경 변수의 범위
환경 변수 업데이트는 일시적이며 현재 파이썬 프로세스에만 유효하다는 점에 유의해야 합니다. 스크립트가 종료되면 변경 사항은 사라집니다.
- 현재 파이썬 프로세스: 파이썬 스크립트 내에서 `os.environ`을 사용하여 환경 변수를 수정하면 변경 사항은 현재 파이썬 프로세스에만 적용됩니다. 실행 중인 다른 프로세스나 향후 파이썬 세션에는 영향을 미치지 않습니다.
- 하위 프로세스: 현재 파이썬 프로세스 내에서 변경된 환경 변수는 스크립트에서 생성된 하위 프로세스에 상속됩니다. 예를 들어 파이썬 스크립트(상위 프로세스)에서 하위 프로세스를 생성하는 경우, 하위 프로세스는 수정된 환경 변수에 접근할 수 있습니다(위의 예시 참고).
- 시스템 전체에 적용되지 않음: 파이썬 스크립트 내에서 설정된 환경 변수는 해당 스크립트 실행 외부에서는 유지되지 않습니다.
시스템 수준에서 환경 변수를 영구적으로 변경해야 하는 경우, 일반적으로 운영 체제별 방법을 사용해야 합니다.
python-dotenv를 사용한 .env 파일 로딩
python-dotenv 라이브러리는 `.env` 파일의 환경 변수를 파이썬 프로젝트로 로드하는 과정을 단순화해 주는 인기 있는 파이썬 패키지입니다. 여러 환경(개발, 프로덕션 등)에 대한 설정이 서로 다르고, 이러한 설정을 소스 코드와 분리하여 관리하고 싶을 때 특히 유용합니다.
python-dotenv 설치
`python-dotenv`를 사용하려면 먼저 설치해야 합니다. 파이썬 패키지 관리자인 `pip`를 사용하여 가상 환경 내에 설치할 수 있습니다.
pip install python-dotenv
.env 파일에서 환경 변수 로드
이제 프로젝트 루트 디렉토리에 `.env` 파일을 만들고, 일반적인 환경 변수처럼 키-값 쌍으로 채울 수 있습니다. 다음은 자리 표시자를 사용하여 만든 `.env` 파일의 예시입니다.
API_KEY=your_api_key_here DB_PASSWORD=your_database_password_here
이제 다음과 같이 `python-dotenv`를 사용하여 `.env` 파일에서 환경 변수를 로드할 수 있습니다.
import os
from dotenv import load_dotenv
# .env 파일에서 환경 변수 로드
load_dotenv()
# 환경 변수 접근
api_key = os.getenv("API_KEY")
database_password = os.getenv("DB_PASSWORD")
# 환경 변수 출력
print(f"API 키: {api_key}")
print(f"데이터베이스 비밀번호: {database_password}")
여기서 환경 변수의 값을 가져오기 위해 `os.getenv(VARIABLE_NAME)`을 사용했다는 점에 주목하십시오. 이 역시 환경 변수에 접근하는 유효한 (그리고 덜 일반적으로 사용되는) 방법입니다.
출력 결과는 다음과 같습니다.
API 키: your-api-key-here 데이터베이스 비밀번호: your-database-url-here
위 예시에서,
- `.env` 파일에 정의된 환경 변수를 현재 환경에 로드하기 위해 `load_dotenv()` 함수를 사용합니다.
- 그다음 `os.getenv()`를 사용하여 환경 변수 `API_KEY`와 `DB_PASSWORD`에 접근합니다.
결론
이것으로 마칩니다! 파이썬 애플리케이션에서 환경 변수를 사용하여 설정과 중요한 정보를 관리하는 방법을 배우셨기를 바랍니다. 환경 변수의 설정과 접근에 대한 기본 사항은 물론, 실제 애플리케이션 설정에서 환경 변수를 어떻게 사용할 수 있는지에 대해서도 알아보았습니다.
환경 변수는 소스 코드에서 설정을 분리하는 데 확실히 도움이 되지만, 프로덕션 환경에서는 민감한 변수를 안전하게 저장해야 합니다. 중요한 정보를 관리하려면 HashiCorp Vault 또는 AWS Secrets Manager와 같은 도구를 살펴보는 것이 좋습니다.