파이썬 가상 환경과 패키지

파이썬 가상 환경과 패키지

파이썬 애플리케이션은 표준 라이브러리에 없는 패키지와 모듈을 쓰는 경우가 많아요. 그런데 애플리케이션마다 필요한 라이브러리 버전이 서로 다르면 문제가 생겨요. A 앱은 1.0을, B 앱은 2.0을 원한다면 하나의 파이썬 설치로 둘 다 충족하기 어렵죠. 이 충돌을 푸는 방법이 **가상 환경(virtual environment)**이에요.

출처: 12. Virtual Environments and Packages

가상 환경이 필요한 이유

가상 환경은 특정 버전의 파이썬 설치와 여러 추가 패키지를 담는 자족적인 디렉터리 트리예요. 애플리케이션마다 서로 다른 가상 환경을 쓰면 되죠. A 앱은 1.0이 설치된 환경을, B 앱은 2.0이 설치된 환경을 각자 가지면 돼요. B 앱이 라이브러리를 3.0으로 올려도 A 앱의 환경에는 영향이 없어요.

가상 환경 만들기

가상 환경을 만들고 관리하는 모듈은 venv예요. venv는 명령을 실행한 파이썬 버전을 설치해요. 예를 들어 python3.12로 실행하면 3.12를 설치하죠. 가상 환경을 만들 디렉터리를 정하고, 스크립트로 venv 모듈을 실행해요.

python -m venv tutorial-env

이 명령은 tutorial-env 디렉터리를 만들고, 그 안에 파이썬 인터프리터 복사본과 필요한 지원 파일들을 담은 하위 디렉터리를 만들어요.

가상 환경의 흔한 위치로는 .venv를 써요. 이 이름은 셸에서 보통 숨겨져 있어서 눈에 거슬리지 않으면서도 그 존재 이유를 설명해 주고, 일부 도구가 지원하는 .env 환경 변수 정의 파일과도 충돌하지 않아요.

가상 환경 활성화하기

가상 환경을 만든 뒤에는 활성화해야 해요. Windows에선 이렇게, Unix나 MacOS에선 이렇게 실행해요.

# Windows
tutorial-env\Scripts\activate

# Unix / MacOS
source tutorial-env/bin/activate

(이 스크립트는 bash 셸용이에요. csh나 fish 셸을 쓴다면 activate.csh·activate.fish 같은 대체 스크립트를 쓰면 돼요.)

활성화하면 셸 프롬프트에 어떤 가상 환경을 쓰는지 표시되고, python을 실행하면 그 특정 버전·설치를 사용하게 돼요.

$ source ~/envs/tutorial-env/bin/activate
(tutorial-env) $ python
Python 3.5.1 (default, May  6 2016, 10:59:36)
  ...
>>> import sys
>>> sys.path
['', '/usr/local/lib/python35.zip', ...,
'~/envs/tutorial-env/lib/python3.5/site-packages']
>>>

참고로 활성화된 가상 환경은 PYTHONPATH 변수를 바꾸지 않아요. 경로에 가상 환경의 파이썬 버전과 호환되지 않는 코드가 있으면 뜻밖의 결과가 나올 수 있으니, best practice는 bash에서 unset PYTHONPATH를 하는 거예요. 비활성화는 deactivate를 입력하면 돼요.

pip로 패키지 관리와 requirements.txt

가상 환경 안에서 pip으로 패키지를 설치하고, 설치된 패키지 목록을 파일로 뽑아 공유할 수 있어요.

(tutorial-env) $ python -m pip freeze > requirements.txt
(tutorial-env) $ cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0

requirements.txt는 버전 관리에 커밋해서 애플리케이션의 일부로 배포할 수 있어요. 다른 사용자는 -r 옵션으로 모든 필요 패키지를 한 번에 설치해요.

(tutorial-env) $ python -m pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
  ...
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0

pip에는 더 많은 옵션과 기능이 있어요. 완전한 문서는 Installing Python modules 가이드를 참고하면 되고, 패키지를 PyPI에 공개하려면 Python packaging user guide를 보면 돼요.

정리하면, 서로 다른 앱의 버전 충돌을 막고 의존성을 또렷하게 관리하려면 가상 환경(.venv)을 만들고, pip freeze로 의존성을 requirements.txt로 뽑아 재현 가능하도록 하는 것이 파이썬 프로젝트의 기본 습관이에요.

더 알아보기