python2와 3는 서로 호환이 되지 않고 같은 버전의 python 환경에서 같은 라이브러리를 쓰더라도 다른 버전의 라이브러리를 사용할 수도 있기 때문에 프로젝트에 마다 python 버전과 라이브러리 버전을 따로 관리해 줄 필요가 있다.
pyenv와 가상환경(virtualenv, venv)는 이런 목적을 가지고 탄생한 tool 이다.

pyenv

python interpreter 는 일반적으로 C로 구현한 것을 사용하는데 이것을 CPython 이라 부른다. 그러나 python interpreter 는 C 로 구현한 것만 존재하는 것이 아니고 Java 로 구현한 JPython, python 으로 구현한 PyPy 등 여러 버전이 존재한다.
pyenv는 이런 여러 버전의 python interpreter 들(CPython, JPython, PyPy 등)중 한 개를 선택 할 수 있는 기능과 같은 python interpreter 에서 서로 다른 python 버전(2.7, 3.4, 3.5 등)을 선택 할 수 있는 기능을 제공한다.

설치 하기

Homebrew 로 설치한다.

$ brew update
$ brew install pyenv

설치한 후에 shell 환경 설정 파일(.bashrc, .zshrc) 에

if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi

를 추가 한다. 추가 후 terminal 을 새로 시작한다.

python 설치

현재 설치된 python 버전을 알고 싶을 때

$ pyenv versions

설치할 수 있는 python 버전을 볼 때

$ pyenv install --list

python 버전을 설치할 때

$ pyenv install 3.5.2  

virtualenv, venv

같은 버전의 python 을 사용하더라도 프로젝트에 따라 사용하는 라이브러리의 버전을 달리 해야 하는 경우가 있다.

예를 들면, python 3.5 에서 Django 1.6 으로 프로젝트를 만들어 진행하고 있었는데 새로운 프로젝트는 python 3.5 에서 Django 1.9 로 하려고 Django 버전을 1.6 에서 1.9로 버전업 한다면 1.6을 사용하던 기존 프로젝트도 원치않게 1.9 로 바뀌게 된다. 그런데 만약 1.6 에서 지원하던 기능이 1.9 로 넘어오면서 deprecated 되었다면?

기존 프로젝트에서는 대체하는 기능을 찾아 코드를 수정해야 하고 수정된 코드에 대한 검증을 다시 해야 한다.
이런 류의 작업은 버전업 계획을 수립하고 진행해야지 갑작스럽게 할 수 있는 것은 아니다.

이렇게 여러 프로젝트가 같은 개발 환경하에서 라이브러리를 공유하게 되면 예상치 못한 문제가 발생할 수 있는데 이것을 방지하고자 일반적으로 가상 환경을 만들어서 프로젝트를 분리한다. virtualenvvenv 는 이런 가상 환경을 손쉽게 구성하고 여러 가상 환경 간의 switch 를 쉽게 할 수 있는 기능을 제공한다.

venv

python 3.4 부터는 가상 환경을 구성해 주는 기능을 python 자체적으로 지원해 주고 있다.
사용법에 대해서는 venv 문서를 참고한다.

virtualenv

python 2 에서부터 현재까지 오랫동안 사용되어 온 가상 환경 구성 tool 이다.
사용법에 대해서는 virtualenv 문서를 참고한다.

pyenv-virtualenv

pyenv 에서는 가상 환경 관리를 위한 plugin 을 제공한다. 개별적으로 virtualenv 를 깔거나 venv 를 사용하기 하기 보다는 pyenv 와 연계된 plugin 을 사용하는 것이 좋을 것 같다.

  • pyenv-virtualenv 설치하기
    $ brew install pyenv-virtualenv
    

    설치한 후에 shell 환경 설정 파일(.bashrc, .zshrc) 에

    if which pyenv-virtualenv-init > /dev/null; then eval "$(pyenv virtualenv-init -)"; fi
    

    를 추가 한다. 추가 후 terminal 을 새로 시작한다.

  • 가상환경 만들기
    $ pyenv virtualenv 3.5.2 venv35
    
  • 가상환경 활성화
    $ pyenv activate venv35
    
  • 가상환경 비활성화
    $ pyenv deactivate
    

autoenv

$ pyenv activate venv35 와 같이 가상 환경 이름을 일일이 입력해서 설정하는 것이 여러 가상 환경을 사용하는 경우에는 불편할 수 있다.
autoenv 는 특정 프로젝트 폴더에 들어가면 자동으로 그 프로젝트와 연결된 가상 환경을 설정해 주는 기능을 제공한다.

autoenv 설치하기

$ brew install autoenv

설치한 후에 shell 환경 설정 파일(.bashrc, .zshrc) 에

source /usr/local/opt/autoenv/activate.sh

를 추가 한다. 추가 후 terminal 을 새로 시작한다.

가상 환경을 설정할 프로젝트 디렉토리에 .env 파일을 만들고 아래와 같이 내용을 입력한다.

venv=venv35
currentvenv=""

if [[ $VIRTUAL_ENV != "" ]]
then
  currentvenv="${VIRTUAL_ENV##*/}"
fi

if [[ "$currentvenv" != "$venv" ]] 
then
  echo "Switching to environment: $venv"
  pyenv activate $venv
  nvm use v6.11.2
else
  echo "Already on environment $venv"
fi

venv35 는 설정한 가상 환경의 이름이다. 각각의 프로젝트 가상 환경 이름에 따라 바꾼다.
단순히 가상 환경만 설정할 수 있는 것이 아니라 프로젝트에 따라 다양한 초기화 명령을 수행하게 할 수 있다.
예를들면 nodejs 를 사용하는 경우 어느 버전의 nvm 을 사용할 지 정할 수도 있다.