Jello's development blog

Jello's development blog

맥에서의 파이썬 개발 환경 자동화(pyenv, virtualenv, autoenv)

이 글은 Mac에서 homebrew, vim가 설치되어 있다고 가정하고 작성되었다.

Python의 버전 관리 문제

Python은 2.x와 3.x의 버전이 아주 다르다. 가장 대표적으로 알려진 print문법부터 시작해서,정수 나눗셈, 유니코드, 여러 구문들이 포함되고, 괄호를 추가하여 더 명시적으로 바뀌었고, 비슷한 기능은 합쳐졌다.

이렇게 많은 차이점이 생기다 보니 아직까지 3.x를 지원하지 않는 Python package도 많고(fabric은 3.x를 제대로 지원하지 않는다), 시간이 지나면서 3.x가 우세하게 되었지만, 아직까지도 2.x의 장점 때문에 구버전을 쓰는 사람들이 꽤 있다.

Python의 dependency 관리

Node 모듈으로 만들어지는 Javascript 프로젝트는 package.json으로 Dependency를 관리하고, Ruby 프로젝트는 gemfile실행파일으로 관리한다. 그렇다면 Python은 이 문제를 어떻게 해결할까?

Python은 Virtualenv라는 툴으로 이 문제를 해결한다. 먼저 맥에 virtualenv를 설치한 후에, 각 프로젝트마다 쓰일 가상 환경(virtual environment)를 생성하여 그 프로젝트에 해당되는 Python을 활성화 한 후에 실행시킨다.

가상 환경 안에 설치된 package들은 freeze명령어를 통해서 requirements.txt라는 파일로 추출되고, 이것을 git같은 버전 관리 도구로 관리하면, 새로운 개발 환경에서도 쉽게 이를 동기화시킬 수 있다.

pyenv란 무엇인가?

pyenv란 여러 버전의 Python을 쉽게 바꿔서 쓸 수 있게 해주는 도구이다. 예를 들면 3.5.2버전을 쓰다가, 명령어 한 줄로 2.7.12로 버전을 바꾸어서 쓸 수 있게 해준다. 이는 python-virtualenv와 같이 쓰면 더욱 활용도가 높아진다. python-virtualenv에 관해서는 밑에서 설명하도록 하겠다.

pyenv, pyenv-virtualenv 설치

pyenvpyenv-virtualenv를 설치하자

$ brew install pyenv
$ brew install pyenv-virtualenv

설치하고 나면 경고메시지가 뜨면서 다음과 같은 문구를 .bash_profile에 추가하라는 메시지가 뜬다.

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

이것을 vim이나 명령어나 편집기를 이용해서 ~/.bash_profile에 추가해주자. 이 파일 안에 있는 구문은 터미널이 켜질 때 같이 실행된다.

pyenv로 버전 설치

pyenv로 설치할 수 있는 버전의 목록을 보려면 다음과 같은 명령어를 입력한다.

$ pyenv install --list

[list들]

엄청나게 많은 버전들이 있을텐데, 여기서는 현재 최신 버전인 3.5.2버전을 설치하도록 하겠다. (목록에서 위로 올리다 보면 있다)

$ pyenv install 3.5.2

이렇게 하면 설치가 완료된다. 설치하는데에 시간이 조금 오래 걸린다. 설치된 목록을 확인하려면 다음과 같은 명령어를 입력한다.

$ pyenv versions

* system (set by PYENV_VERSION environment variable)
  3.5.2

지금은 기본 system, 3.5.2가 설치되어 있다고 나온다. 버전 이름 맨 앞의 *표시는 현재 사용하고 있는 Python버전이다. 버전을 옮기려면 다음과 같은 명령어를 입력한다.

$ pyenv shell 3.5.2

pyenv로 virtualenv 생성

버전을 설치해 봤으니 그 버전 위에 올라갈 virtualenv를 설치해보도록 하자. test라는 이름을 가진 virtualenv를 3.5.2버전 위에 설치해보자.

$ pyenv virtualenv 3.5.2 test_virtualenv

pyenv virtualenv [VERSION_NAME] [VIRTUALENV_NAME] 형식으로 입력해주면 된다.

$ pyenv versions

* system (set by PYENV_VERSION environment variable)
  3.5.2
  3.5.2/env/test_virtualenv

versions명령어로 3.5.2 위에 test_virtualenv라는 환경이 설치된 것을 확인할 수 있다.

쓰고있는 버전을 옮기려면 똑같이 shell 명령어를 사용하면 된다. activate명령어를 이용해도 된다.

$ pyenv shell[or activate] test

shell 명령어는 Python의 버전virtualenv에 모두 적용할 수 있는 명령어이고, activate 명령어는 virtualenv에만 사용이 가능하다. shell을 이용해서 다른 버전이나 virtualenv를 사용중이라면 pyenv shell system을 이용하여 기본 버전으로 되돌아올 수 있고, activate를 이용하여 virtualenv를 사용중이라면 pyenv deactivate를 이용하여 사용중인 virtualenv에서 나올 수 있다.

requirements.txt 생성

test를 하나의 Python 프로젝트라고 생각하자. 이곳에 프로젝트에 필요한 package들을 설치해야 한다. pip로 Django를 설치하고, freeze로 package들 목록을 추출해보자.

$ pip install django
$ pip freeze > requirements.txt

requirements.txtDjango==1.10.1라고 현재 설치된 package가 적혀있다. 이는 pyenv파일에 독립적으로 설치된 package이고, 다른 virtualenv나 버전으로 옮기면 사용할 수 없게 된다. 이로써 의존성 관리 문제를 해결 하게 된 것이다.

다른 개발 환경에서 프로젝트에 설치된 패키지를 동기화하려면 virtualenv를 만들고, shell명령어로 사용 설정을 한 뒤에, requirements.txt파일을 받아서 다음과 같은 명령어를 입력한다.

$ pip install -r requirements.txt

requirements.txt라는 이름은 반드시 정해진 것이 아니라 package목록을 담는 파일이름으로 관습적으로 사용하는 것이다.

autoenv 설치

위에까지가 Python에만 종속되는 내용이었고, 이번에 설치할 autoenv는 Python뿐만 아니라 모든 명령어에 적용할 수 있다. 다음과 같은 명령어로 설치한다.

$ brew install autoenv

이번에도 .bash_profile에 설정을 해줘야한다. 다음과 같은 내용을 맨 밑에 넣어준다.

source $(brew --prefix autoenv)/activate.sh

autoenv를 이용한 자동화

autoenv는 터미널에서 디렉토리에 접근할 시에, .env파일을 찾아서 그 내용을 자동으로 실행시켜주는 간단한 기능이다. 그렇다면 test디렉토리를 만들어서, 디렉토리에 들어올 때 바로 test_virtualenv virtualenv로 설정되게 해보자! 명령어 한 줄을 입력하는 귀찮음을 덜 수 있는 것이다.

$ mkdir test_virtualenv
$ cd test_virtualenv
$ vim .env

.env파일안에 다음과 같은 내용을 입력하자.

pyenv shell test_virtualenv

제일 먼저 디렉토리에 들어가게 되면, .env의 내용을 실행할 것인지 물어보게 된다. 이 때 ‘y’를 입력해서 계속 실행되게 해야한다.

이제 터미널에서 test폴더에 들어갈 때마다 자동으로 test_virtualenv virtualenv를 쓰게 될 것이다! autoenv는 이것 뿐만 아니라 다른 분야에도 무궁무진하게 적용할 수 있다.

참고 문서