pip와 virtualenv를 이용한 파이썬 디플로이먼트 :: 2011/11/23 19:36

프로그래머가 만든 프로그램을 실제 실행환경에 심는 것을 소프트웨어 디플로이먼트(Software deployment)라고 한다. 적절한 한국어 번역은 잘 떠오르지 않는다. "설치"는 installation의 번역이고, "배포"는 distribution의 번역이다 보니 적절한 단어가 떠오르지 않는다. "배치"는 batch 같아 좀 아닌것 같고.
 
어쨌건, 파이썬 프로그래머를 위한 유용한 디플로이먼트 도구인 pip, virtualenv를 잘 모르는 분들이 많은 듯 하여 소개해 보고자 한다. 이게 어디에 써먹는 것이냐 하면, 하나의 서버에 여러개의 파이썬 버전을 서비스한다던가, 복잡하게 갖다 쓴 써드파티 라이브러리들 쉽게 설치한다던가 등에 긴요하게 쓸 수 있다.
 
서비스서버를 새로 구입했고, 거기에 내가 만든 장고(Django) 어플리케이션을 두개를 올린다고 가정해보자. 마침 그 두 프로그램은 사용한 장고 버전이 다르다. 하나는 최신 버전(1.3.1)인데, 또 하나는 옛날에 만든것을 아직 새 버전에 맞추지 않아 1.0.3 버전에서 돌아야 한다. 게다가 추가로 설치해야 할 써드파티 라이브러리들도 많다. 이경우 운용환경을 구축하기가 꽤 번거로운데 pip, virtualenv를 쓰면 매우 편리하다.
 
우분투 서버라고 가정하면, 다음처럼 시작하는 것이 좋다.

$ sudo apt-get install python-setuptools
 
python-setuptools 패키지를 깔면 easy_install 명령을 쓸 수 있다. 왜 저 패키지가 파이썬 빌트인에 들어있지 않은가는 참 아쉬운 부분. 우분투니까 저렇게 되지 다른 배포판에서는 찾아서 깔아 쓰기 많이 귀찮다.
 
setuptools를 설치하고 나면, 파이썬 기본 패키지 관리자로 easy_install을 쓸 수 있다. 리눅스 패키지 관리자를 apt-get 하나만 쓰는 것이 여러모로 좋듯 파이썬 패키지 관리자도 easy_install 하나만 쓰는 것이 좋다. 아, 우분투에서는 파이썬 패키지들도 apt-get으로 관리하는 것도 좋다. 어쨌건 여러개 쓰면 머리아프니 하나만 쓰자. 기왕이면 오늘부터는 easy_install 대신에 지금 소개하는 pip로.
 
$ sudo easy_install pip
 
위 명령으로 pip를 간단히 설치한다. pip는 easy_install이랑 비슷하지만 훨씬 더 다양한 기능들을 갖고 있다. 특정 패키지를 버전별로 설치한다던가, 삭제한다던가, 여러 패키지를 한번에 설치한다던가가 가능하다. (물론 우분투라면 easy_install을 건너뛰고 "apt-get install python-pip" 로 바로 설치할 수도 있다.)
 
시스템의 기본 파이썬 실행환경으로 각 패키지들을 최신버전으로 유지하고 별도의 실행환경을 만들어 그곳에는 구 버전을 쓰고자 한다. 그래서 일단 기본 실행환경에서는 최신버전을 설치한다.

$ sudo pip install django

위 명령은 기본 파이썬 실행환경에 장고 최신버전을 설치한다. 그리고 최신버전용 장고 어플리케이션은 그대로 하던대로 설치한다. 그냥 디폴트 환경은 최신버전을 쓰는 것으로 정한다. 그러고 나서, 별도의 구버전 장고가 돌아갈 별도의 파이썬 실행환경을 만들 수 있는데 이때 쓰는 것이 virtualenv다. 말그대로 가상의 파이썬 실행환경을 만들어준다. 
 
$ sudo pip install virtualenv

위 명령으로 virtualenv를 깔고 나면 virtualenv 명령어를 바로 쓸 수 있다.
 
$ mkdir ~/work/py-envs
$ cd ~/work/py-envs
$ virtualenv --no-site-packages --distribute angr

py-envs라는 디렉토리를 만든다. 말 그대로 파이썬 환경들을 모아두는 곳이다. 그 안에 angr이라는 이름의 환경을 만든다. --no-site-packages 옵션은 파이썬 기본 실행환경에 있는 라이브러리를 쓰지 않겠다는 의미이며, --distribute 옵션은 setuptools 대신에 distribute를 쓰겠다는 뜻이다.
 
$ source angr/bin/activate

위 명령을 내리면 새로 생성한 angr이란 환경으로 진입한다. 쉘 프롬프트 앞부분에 지금부터 angr환경이라는 의미로 (angr)이 표시된다. 저 환경에서 탈출할때는 deactivate 명령을 내리면 된다. angr 환경에 들어가서 파이썬 쉘이 들어가 "import django" 해보자. 패키지가 설치되지 않았다고 나올 것이다. 지금 새로 만든 angr 환경은 --no-site-packages 옵션이 사용됐기 때문에 기본 설치된 파이썬 환경을 이용하지 않는다. 여기에 별도로 장고 구버전을 설치하면 된다. 이때 써야하는 설치 프로그램이 바로 pip다.
 
(angr)$ pip install django==1.0.4

위 명령은 angr 파이썬 실행환경에서 장고 1.0.4 버전을 설치한다. 장고 이외에 필요한 써드파티 라이브러리들도 모두 설치하자.
 
(angr)$ pip install numpy
(angr)$ pip install matplotlib

matplotlib의 경우 Mac OS X에서 빌드과정에 문제가 있다. 검색해보니 최신 개발버전을 쓰면 괜찮다고.
 
(angr)$ pip install -e git://github.com/matplotlib/matplotlib.git@v1.1.0-rc1#egg=matplotlib

pip는 패키지의 버전을 정해줄 수 있을 뿐 아니라 위 명령처럼 저장소를 지정해줄 수도 있다.
 
장고 어플리케이션을 구동할 경로는 위 가상환경의 경로와 상관없이 쓰던대로 쓰면 된다. 본 예제에서는 /home/sites 디렉토리에 asite, bsite 가 있다고 가정한다. (asite는 파이썬 기본 환경, bsite는 angr 이름의 가상환경)
 
파이썬 가상 환경에 django, numpy, matplotlib 라이브러리를 설치했다. 다음부터 이 설치를 한방에 할 수 있도록 하는 명령이 "pip freeze" 이다.
 
(angr)$ pip freeze > angr/pip-requirements.txt
(angr)$ cat angr/pip-requirements.txt
Django==1.0.4
matplotlib==1.1.0
numpy==1.6.1

위 명령은 angr 경로에 pip-requirements.txt 파일을 생성한다. 이제 다른 서버에 이전한다던가 할때 pip-requirements.txt 파일만으로 한방에 설치할 수 있다.
 
(angr)$ pip install angr/pip-requirements.txt

실제 운용을 위한 웹서버연동시 bsite는 angr이라고 만든 가상 환경을 연결해야 한다. 아파치 mod_python 을 연동해 쓴다면 다음처럼 설정한다.
 
<Location ~ "/asite/">
    SetHandler python-program
    PythonPath "['/home/sites', '/home/sites/asite'] + sys.path"
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE asite.settings
    Order allow,deny
    Allow from all
</Location>
<Location ~ "/bsite/">
    SetHandler python-program
    PythonPath "['/home/yong27/work/py-envs/angr/bin', '/home/sites', '/home/sites/bsite'] + sys.path"
    PythonHandler angr_modpython_handler
    SetEnv DJANGO_SETTINGS_MODULE bsite.settings
    Order allow,deny
    Allow from all
</Location>

bsite 설정을 위해 가상 환경 경로에 angr_modpython_handler.py 를 만들고 다음처럼 기록한다.
 
activate_this = '/home/yong27/work/py-envs/angr/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
from django.core.handlers.modpython import handler

이렇게 아파치를 구동하면 bsite는 가상환경으로 구동된다. mod_wsgi로 연동할때도 유사하게 설정할 수 있다.
 
이상, pip와 virtualenv를 이용한 파이썬 디플로이먼트 및 가상환경 운용에 대해 알아보았다. 파이썬 어플리케이션을 구동할 때 운용환경이 맞지 않아 삽질하는 경우가 많은데, 이처럼 어플리케이션별로 운용환경을 정립하고 버전도 테스트된 버전만을 쓰도록 하면 설치도 쉽고 오류도 적은 운용이 가능하다.
Trackback Address :: http://yong27.biohackers.net/trackback/373
  • BlogIcon klarheit | 2012/12/10 22:43 | PERMALINK | EDIT/DEL | REPLY

    글 잘 읽었습니다. 저는 맥환경에서 ipython으로 그냥 간다하게 매크로 정도 말들고, django로 간단한 설문 사이트를 만들어 본 정도인데, 재밌는 글 읽었습니다.

Name
Password
Homepage
Secret
< PREV #1 ... #4 #5 #6 #7 #8 #9 #10 #11 #12 ... #307  | NEXT >