파이썬 프로젝트 시작하기 - Virtualenv

주석

파이썬 3 환경에서 가상 환경을 사용하는 방법은 가상 환경 친화적 앱 에서 논의합니다.

Virtualenv 는 시스템에 설치된 파이썬에 영향을 주지 않고 파이썬의 가상 환경을 유지할 수 있도록 합니다. 가상 환경에서는 파이썬 실행파일, 라이브러리 설치 장소 등이 따로 제공됩니다. 이 곳에 패키지를 설치해도 시스템의 파이썬이나 다른 가상 환경에는 영향을 주지 않도록 설계되어 있습니다.

이 글에서는 Virtualenv 를 사용해서 프로젝트 별 가상 환경을 구성하고, 편집기나 IDE 등이 가상 환경을 사용하도록 설정하는 방법을 살펴봅니다. 이제 막 파이썬의 기초를 마치신 분들도, 일찌감치 Virtualenv 를 활용하는 법을 익혀두시면 좋습니다.

이 글에서는 virtualenvwrapper 와 같이 virtualenv 를 확장하는 패키지는 다루지 않습니다. 특별한 이유는 없고, 단지 필요성을 느끼지 못해 사용하지 않고 있기 때문입니다. 하지만 Setuptools 는 저희의 프로젝트 관리에서 중요한 역할을 담당합니다. Virtualenv 도 Setuptools 와 연계될 때 더욱 유용해집니다. Setuptools 의 일부는 다루지만, 본격적인 Setuptools 의 활용은 별도의 글에서 다루겠습니다.

환경

이 글에서 다루는 OS 는 OS X, 윈도우즈, 리눅스입니다. OS X 를 기준으로 설명하고, 다른 OS 에서 차이점이 있다면 따로 설명합니다.

여러분이 어떤 OS 를 사용하시건 PATH 에서 버전 2.6 이상의 파이썬 실행파일을 찾을 수 있어야 합니다. 이 보다 낮은 버전의 파이썬은 사용하지 않고 있습니다. 명령 행에서 python 을 입력하면 >>> 프롬프트가 떨어져야 합니다. 미리 설치되어 있어야 하는 모듈이나 패키지는 없습니다.

라이브러리 버전 충돌

저희가 virtualenv 를 통해 풀려고 하는 문제는 라이브러리 버전 충돌 문제입니다. 예를 들어 AAA, BBB 라는 두 개의 프로젝트가 있습니다. 이 두 프로젝트는 모두 LLL 이라는 라이브러리를 사용한다고 합시다. AAA 는 작년에 만들어져 프로덕션 서버에서 운영되고 있는 반면, BBB 는 막 시작되는 프로젝트 입니다. 그런데 AAA 는 LLL 버전 3.0을 사용해서 개발된 반면, BBB 는 다른 모듈들 과의 연동 때문에 새로 릴리즈된 LLL 버전 4.0을 사용해야 합니다. 시험 삼아 AAA 를 LLL 4.0 과 연결해 보니 문제가 발생합니다. AAA 를 유지 보수함과 동시에 BBB 를 개발해야 하는 경우에 LLL 을 어떻게 관리해야 할까요?

한가지 방법은 LLL 을 프로젝트에 포함시키는 것입니다. LLL 이 간단한 라이브러리라면 이 방법도 나쁘지 않습니다. 만약 LLL 의 코드를 일부 수정해서 사용해야 한다면 이 방법이 좋습니다. 하지만 LLL 에 특별한 빌드 절차가 수반되거나 하면 귀찮은 일들이 생기기 시작합니다. 항상 쓸 수 있으면서도 간단한 방법을 원합니다.

virtualenv 를 사용하면 이 문제가 깔끔하게 해결됩니다. 프로젝트 AAA 와 BBB 를 위한 별도의 가상 환경을 만들고, 각 가상환경에 서로 다른 버전의 LLL 을 설치하는 것입니다. 이제 각 가상 환경에서 실행되는 프로젝트는 각자 필요한 버전의 LLL 을 사용하게 됩니다. 시스템 파이썬은 여전히 LLL 이 설치되지 않은 상태를 유지하고요.

Virtualenv

Virtualenv 는 표준 라이브러리에 포함되어 있지 않기 때문에, 별도로 설치해야 합니다. 이 라이브러리만큼은 가상 환경 내에 설치할 수 없습니다. 그래서 그냥 시스템 파이썬에 설치하는 경우가 일반적입니다. 저는 조금 다르게 접근합니다.

프로젝트가 virtualenv 를 들고 들어가도록 합니다. 파일 세 개만 다운로드 해서 프로젝트 폴더에 넣어두면 됩니다. 이 글의 끝에 나오는 폴더 구조를 참고하세요.

virtualenv.py의 경우 이 글을 쓰는 시점에는 버전 1.10.1 이 다운로드 되고 있습니다. setuptools 와 pip 의 경우도 현재로서는 최신 버전입니다. 전부 합쳐 1.2MB 정도로, 크기가 꽤 됩니다. 하지만 이 방법은 몇 가지 장점을 제공합니다.

  • 최대 수준의 격리를 실현할 수 있습니다. Virtualenv 를 포함한 몇 가지 기본 패키지들의 버전도 프로젝트마다 독립적으로 유지할 수 있습니다.
  • 프로젝트의 시스템 요구사항을 최소화할 수 있습니다. 프로젝트를 다양한 환경에서 여러 개발자가 공유해야 할 때 편리합니다.

이제 콘솔 명령을 실행합니다. 지금부터는 프로젝트 홈, 즉 virtualenv.py 파일이 있는 위치에서 명령을 실행하고 있다고 가정하겠습니다.

python virtualenv.py venv

venv 라는 이름의 폴더가 생기고, 그 밑에 가상 환경이 만들어져야 합니다. 폴더 이름은 바꾸셔도 좋습니다.

가상 환경으로 들어가시려면 이런 명령을 입력합니다.

source venv/bin/activate

윈도우즈에서는 이렇습니다.

venv\Scripts\activate

아마도 프롬프트 앞에 (venv) 가 붙어서 가상 환경임을 알려줄 겁니다. 가상 환경에서 python 을 실행한 후에 sys.executable 을 들여다보면 파이썬 실행 파일이 venv 폴더 아래에 들어있는 것을 확인할 수 있습니다. 이제 가상 환경에서 표준적인 절차로 설치되는 패키지들도 venv 폴더 아래로 들어갑니다.

가상 환경에서 빠져 나오려면 이런 명령을 내리면 됩니다.

deactivate

Pip

지금까지의 절차를 따라왔다면, 가상 환경에는 Setuptools 와 Pip 가 미리 설치됩니다. Pip 를 사용하면 PyPI(the Python Package Index)라고 부르는 파이썬 패키지 저장소에 등록되어 있는 패키지들을 손쉽게 설치할 수 있습니다. 예를 들어 웹 프레임워크 Pyramid 를 설치하려면 이렇게 하면 됩니다.

pip install pyramid

이 글을 쓰는 시점에는 Pyramid 1.4.5 가 설치됩니다. 1.5a1 버전을 테스트해 보고 싶다면 이렇게 지정할 수 있습니다.

pip install pyramid==1.5a1

만약 프로젝트가 특정 라이브러리 버전에 민감하다면, 이런 식으로 구체적인 버전을 지정하면 됩니다.

만약 가상 환경에 들어가지 않은 상태라면 pip 대신에 venv/bin/pip를 사용하시면 됩니다. (윈도우즈의 경우는 venv\Scripts\pip 입니다.)

Sublime Text 2

Sublime Text 2 에는 REPL(Read-Eval-Print Loop)이라고 부르는 기능이 있습니다. 각종 인터프리터 언어들의 대화형 모드들 지원하는 탭을 제공하는 것입니다. 편집기를 떠나지 않고 인터프리터로 코드를 실행해 볼 수 있으니 여러모로 편리합니다. 파이썬의 경우는 Virtualenv 도 지원합니다만, 설정을 손볼 필요가 있습니다.

Preferences > Package Settings > SublimeREPL > Settings - Default 메뉴를 선택하면 REPL 설정 파일이 로드됩니다. 이 중 python_virtualenv_paths 항목을 찾아서 여러분의 프로젝트 폴더를 추가해 주면 됩니다. 제 맥북 에어의 경우는 이렇습니다.

// Where to look for python virtualenvs
"python_virtualenv_paths": [
    "~/works/*",
    "~/.virtualenvs",  // virtualenvwrapper
    "~/.venv"  // venv.bash https://github.com/wuub/venv
],

제 프로젝트들은 홈디렉토리(~) 바로 밑에 있는 works 라는 폴더에 만들어집니다. 프로젝트를 추가할 때마다 이 파일을 수정할 수는 없으니 ~/works/* 라는 패턴 하나만 추가합니다. 각자 프로젝트를 만드는 위치가 다를 것이니 자신의 관례대로 설정해 주시면 됩니다. 그런 장소가 여러 개라면 모두 등록해 주세요.

이제 Tools > SublimeREPL > Python > Python - virtualenv 면 발견된 가상 환경들의 목록을 보여주는 창이 하나 나옵니다. 경로를 보고 원하는 것을 선택하시면 REPL 탭이 열립니다. 이 파이썬 창은 가상 환경에서 실행한 파이썬과 동일합니다.

PyDev

Sublime Text 2 같은 편집기로 작업하는 것보다, Eclipse 와 같은 IDE 를 선호하시는 분들도 많습니다. PyDev 의 경우는 편집도중 예상되는 오류들을 보여주는 기능이 있습니다. 썩 정확하게 동작하는 것 같지는 않지만 방치하면 눈에 많이 거슬립니다. Eclipse 환경 설정의 PyDev/Interpreter - Python 에서 파이썬 인터프리터를 등록할 수 있습니다. 이곳에 venv/bin/python 을 적당한 이름으로 등록한 후, 이 이름을 프로젝트 설정의 Pydev - Interpreter/Grammar 에서 선택해 주면 됩니다. 프로젝트 설정은 프로젝트 파일에 저장되기 때문에 한번만 하면 되지만, Eclipse 설정은 프로젝트에 사용할 모든 Eclipse 마다 동일한 이름으로 등록해 줘야 합니다.

폴더 구조

Virtualenv 를 설치한 직후의 프로젝트 폴더는 이렇게 구성됩니다.

~/works/PROJECT/
    virtualenv.py
    setuptools-x.x.x.tar.gz
    pip-x.x.x.tar.gz
    venv/
        bin/ or Scripts/
            python or python.exe
            …
        lib/ or Lib/
        include/ or Include/

최소한의 가상 환경을 구축했으면 다음 단계는 Setuptools 로 프로젝트의 틀을 만드는 것입니다. 언젠가 이 주제로 다시 만나기로 하고, 이 글은 여기서 마무리합니다.

업데이트: 파이썬 프로젝트 시작하기 - Distutils 로 이어집니다.