파이썬에서 환경 변수 읽어오기 (os.environ)
Feb 29, 2020 · 3 min read



환경 변수(environment variable)

소프트웨어 개발에서 환경 변수(environment variable)는 일반적으로 운영 체제(oerating system) 차원에서 설정해주는 변수를 의미하는데요. 주로 애플레케이션 레벨에서 설정하기가 불가능하거나 어려운 값들을 환경 변수에 저장하는 경우가 많습니다.

대표적인 예로, 개발 모드와 운영 모드를 구분하기 위해서 애플리케이션이 돌아가는 환경 자체를 ENV 등의 이름으로 변수화해야할 때가 있는데 이는 코드 상에 저장하기가 난해합니다. 또 다른 예로, 외부 API와 연동하기 위해서 사용되는 접근키(access key)나 보안키(secret key)와 같은 인증 정보는 보안 측면에서 코드 상에 저장을 하면 안 됩니다.

os 내장 모듈

파이썬으로 작성된 애플리케이션에서는 기본적으로 내장되어 있는 os 모듈을 통해서 운영 체제의 환경 변수 값을 읽어올 수 있습니다. 우선, 파이썬 인터프리터를 실행한 후, os 모듈을 임포트하는 것 부터 시작하겠습니다.

$ python
Python 3.8.1 (default, Jan 11 2020, 20:11:31)
[Clang 11.0.0 (clang-1100.0.33.16)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os

os.environ 속성

운영 체제에 등록되어 있는 모든 환경 변수는 os 모듈의 environ이라는 속성을 통해서 접근이 가능합니다. 이 os.environ 속성은 마치 파이썬 내장 자료 구조인 사전(dictionary)을 사용하듯이 사용할 수 있습니다.

예를 들어, 환경 변수 HOME에 저장되어 있는 값은 다음과 같이 읽어올 수 있습니다.

>>> os.environ['HOME']
'/Users/dale'

파이썬의 사전이 존재하지 않는 키를 넘길 경우, KeyError를 발생시키는 것처럼, os.environ도 동일하게 동작합니다. 그래서 애플리케이션 코드를 작성할 때는 환경 변수가 존재하지 않는 경우에 대한 적당한 예외 처리를 해줘야 합니다.

>>> os.environ['ENV']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/dale/.pyenv/versions/3.8.1/lib/python3.8/os.py", line 673, in __getitem__
    raise KeyError(key) from None
KeyError: 'ENV'

어떤 환경 변수가 없을 때, 예외를 발생시키는 대신에 None을 반환받고 싶은 경우에는 사전과 동일하게 get() 메서드를 사용하면 됩니다.

>>> assert os.environ.get('ENV') is None

get() 메서드의 두 번째 인자로 기본값을 넘길 수도 있습니다. 꼭 설정해주지 않아도 되는 환경 변수에 유용하게 사용됩니다.

>>> os.environ.get('ENV', 'development')
'development'

es.getenv 함수

os 모듈의 getenv() 함수를 사용하면 좀 더 간결한 코드로 os.environ.get() 함수와 동일한 효과를 얻을 수 있습니다.

>>> assert os.getenv('ENV') is None
>>> os.getenv('ENV', 'development')
'development'

환경 변수 관련 다른 함수들

os 모듈에는 새로운 환경 변수를 추가해주는 putenv()나 기존 환경 변수를 제거해주는 unsetenv()와 같은 함수들도 있는데 매우 주의해서 사용해야 합니다. 왜냐하면 이러한 함수들로 운영 체제 상의 환경 변수를 변경하였더라도, os 모듈이 최초 임포트될 때 이미 세팅되었던 os.environ에는 반영이 되지 않기 때문입니다. 따라서 이렇게 환경 변수를 조작하는 함수를 직접 사용하는 것 보다는 os.environ를 통해서 마치 사전 다루듯이 환경 변수를 추가/제거 하는 것이 더 안전 합니다. 무엇보다 맨 처음에 설명드린 환경 변수의 용도를 생각해보면 대부분 환경 변수는 애플리케이션 레벨에서는 읽기 전용으로 쓰이는 것이 대부분일 것입니다.

참고






Engineering Blog  by Dale Seo