pip로 설치한 패키지들은, 흔히 말하는 '전역 환경'에서 관리되기에 문제가 생길 수 있습니다. 한 프로젝트에선 Flask 0.13을 쓰고 다른 프로젝트에선 Flask 1.0을 쓰는 버전 관리 문제나, 다른 프로젝트에선 쓰지 않을 numpy를 사용한다거나 하는 경우입니다. 특히 위와 같은 버전 관리 문제의 경우, 여간 번거로운 일이 아닙니다. 프로젝트 A에서 Flask 0.13, 프로젝트 B에서 Flask 1.0을 쓴다면, 아래와 같은 시나리오가 전개됩니다.

  • 프로젝트 A를 진행하기 위해 Flask 0.13 설치
  • 프로젝트 B를 진행하기 위해 Flask를 uninstall하고 1.0 설치
  • 다시 프로젝트 A를 진행하기 위해 Flask를 uninstall하고 0.13 설치
  • Flask uninstall 과정에서 werkzueg, jinja와 같은 의존성 라이브러리는 제거되지 않아 1.0에선 생기지 않던 오류 발생
  • pip, wheel, setuptools만 남기고 모두 삭제하고 다시 Flask 0.13을 비롯한 프로젝트 A의 의존성 설치

이런 문제를 해결하기 위해 virtual environment라는 개념이 존재합니다. 이는 디렉토리 단위로 격리된 Python 환경을 구성해 줍니다. 대표적으로 virtualenv라는 CLI 라이브러리를 사용합니다.

$ pip3 install virtualenv

virtualenv -p [python_version] [venv_name]

virtualenv의 사용법은 매우 간단합니다.

$ virtualenv venv
Using base prefix '/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6'

(...)

Installing setuptools, pip, wheel...done.

위의 명령을 실행하면 venv라는 디렉토리가 생성되고, 격리된 Python 환경이 구성됩니다. 기본 Python 버전은 virtualenv 패키지가 설치된 경로의 python입니다. 위의 경우 전역의 python 3.6.5 환경에 설치되어 있는 virtualenv를 사용했으므로, python 3.6.5로 구성됩니다. 특정 버전에 대해서 가상 환경을 구성하려면, --python이나 -p 인자를 이용해 버전을 명시하면 됩니다.

$ virtualenv -p python2 venv
Running virtualenv with interpreter /usr/local/bin/python2

(...)

Installing setuptools, pip, wheel...done.

. [venv_name]/bin/activate

venv 하위의 bin 디렉토리에 있는 activate 파일을 실행시켜 가상 환경을 활성화합니다. 활성화에 성공하면, 쉘의 맨 앞에 가상 환경의 디렉토리명이 표시됩니다.

$ . venv/bin/activate
(venv) $

활성화된 가상 환경 안에서 사용하는 pip는 해당 가상 환경에서만 적용되기 때문에, 전역 환경과 확실하게 격리된 환경을 구성할 수 있게 됩니다. 또한 venv가 활성화되는 주체는 쉘 단위기 때문에 디렉토리를 이동해도 계속해서 유지되며, 가상 환경 내에서는 pip와 pip3를 구분하지 않습니다. 가상 환경에서 빠져 나오려면, deactivate 명령을 입력합니다.

(venv) $ deactivate
$ 


'Python 계열 > Python External Library' 카테고리의 다른 글

[Python External Library] virtualenvwrapper  (0) 2018.09.07

virtualenv는 디렉토리 단위로 가상의 Python 환경을 구성함에 있어 굉장히 강력합니다. 이 점에 대해선 반박할 여지가 없는데, 한 가지 단점이라면 가상 환경이 한 곳에서 관리되지 않아 기억하기 번거롭다는 것입니다. virtualenvwrapper를 사용할 경우, 터미널이 현재 위치한 경로와 관계 없이 가상 환경을 활성화할 수 있다는 장점이 있습니다. 조금의 설정 과정을 거치고 나면, 더욱 더 편하게 virtual environment를 관리하고 사용할 수 있게 됩니다. virtualenvwrapper는 내부적으로 virtualenv를 의존합니다.

$ pip3 install virtualenvwrapper

가상 환경을 관리할 디렉토리 생성 & 환경 변수 설정

먼저 홈 디렉토리로 이동합시다.

$ cd ~

가상 환경이 들어갈 디렉토리를 생성합니다. .venvs 라는 이름을 사용하겠습니다.

$ mkdir .venvs

이제 홈 디렉토리의 .bashrc.zshrc, .profile처럼 쉘의 환경 변수를 관리할 수 있는 곳에 WORKON_HOMEVIRTUALENVWRAPPER_PYTHON 환경 변수를 export하고, virtualenvwrapper.sh를 실행하도록 설정합니다.

export WORKON_HOME=~/.venvs
export VIRTUALENVWRAPPER_PYTHON="$(which python3)"
source /usr/local/bin/virtualenvwrapper.sh

virtualenvwrapper! 써보자!

mkvirtualenv [venv_name]

mkvirtualenvvenv_name을 이름으로 하는 가상 환경을 생성합니다.

$ mkvirtualenv test
Using base prefix '/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/planb/.venvs/test/bin/python3.6
Also creating executable in /Users/planb/.venvs/test/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /Users/planb/.venvs/test/bin/predeactivate

(...)

virtualenvwrapper.user_scripts creating /Users/planb/.venvs/test/bin/get_env_details
(test) $

가상 환경이 생기고, 즉시 activate됩니다. virtualenvwrapper는 virtualenv를 의존하고 있기 때문에, 명령어도 꽤 유사합니다. 가상 환경에 다른 Python 버전을 사용하고자 하는 경우 virtualenv 때처럼 -p--python 인자를 사용하면 됩니다.

$ mkvirtualenv -p python2 test_python2
Running virtualenv with interpreter /usr/local/bin/python2
New python executable in /Users/planb/.venvs/test_python2/bin/python2.7
Also creating executable in /Users/planb/.venvs/test_python2/bin/python
Installing setuptools, pip, wheel...done.

(...)

virtualenvwrapper.user_scripts creating /Users/planb/.venvs/test_python2/bin/get_env_details
(test_python2) $

가상 환경을 빠져나오려면, virtualenv와 동일하게 deactivate를 사용합니다.

(test_python2) $ deactivate
$

workon ([venv_name])

workon 명령은 venv_name에 해당하는 가상 환경에 진입하거나, venv_name이 전달되지 않는 경우엔 가상 환경의 목록을 불러옵니다.

(test_python2) $ workon
test
test_python2
(test_python2) $ workon test
(test) $

rmvirtualenv [venv_names ...]

rmvirtualenv 명령은 venv_names에 해당하는 가상 환경을 모두 제거합니다.

$ rmvirtualenv test test_python2
Removing test...
Removing test_python2...

제거하려는 가상 환경에 workon(activate)되어 있다면, 오류가 발생합니다.

(test) $ rmvirtualenv test
Removing test...
ERROR: You cannot remove the active environment ('test').
Either switch to another environment, or run 'deactivate'.


+ Recent posts