Python 2와 3 혼용 환경에서 virtualenv로 프로젝트 관리하기
문제 상황
회사에서 유지보수 중인 Django 프로젝트는 Python 2.7 기반이고, 새로 시작하는 Flask API는 Python 3.6으로 개발하기로 했다. 한 머신에서 두 버전을 동시에 사용해야 하는 상황이 생겼다.
virtualenv 설정
각 프로젝트별로 독립된 가상환경을 만들어서 해결했다.
# Python 2.7 프로젝트
virtualenv -p python2.7 venv-legacy
source venv-legacy/bin/activate
pip install -r requirements-py2.txt
# Python 3.6 프로젝트
virtualenv -p python3.6 venv-api
source venv-api/bin/activate
pip install -r requirements.txt
requirements.txt 관리
처음에는 수동으로 패키지 버전을 적었는데, 배포 환경에서 의존성 충돌이 발생했다. pip freeze로 정확한 버전을 고정하는 방식으로 변경했다.
pip freeze > requirements.txt
개발 환경에서만 필요한 패키지(pytest, ipython 등)는 requirements-dev.txt로 분리했다.
Python 2 지원 종료 대응
Python 2는 2020년 1월 지원 종료 예정이다. 레거시 프로젝트도 점진적으로 Python 3로 마이그레이션 계획을 세워야 할 것 같다. __future__ 모듈을 사용하면 Python 2 코드에서 Python 3 문법을 일부 사용할 수 있어서 마이그레이션이 조금 수월할 것으로 보인다.
from __future__ import print_function, division
정리
virtualenv 덕분에 프로젝트별로 Python 버전과 패키지를 깔끔하게 분리할 수 있었다. IDE(PyCharm)에서도 프로젝트마다 인터프리터를 다르게 설정할 수 있어서 개발 편의성이 좋아졌다.