# Python 독립 실행환경 사용하기
**파이썬**을 이용한 애플리케이션을 사용하면서 기존에 사용하던 버전과 다른 버전의 **파이썬**이 필요해지거나 `2.7.x` 버전을 사용하는 상태에서 잠시 `3.x` 버전을 사용할 필요가 생기면 제법 귀찮고 불편한 일들이 발생할 수 있다. 버전을 업그레이드 하거나 아니면 환경변수를 변경하거나 해야한다. 또 `site-packages` 에 위치한 수 많은 라이브러리들은 또 어떻게 관리할 것인가? 전부 글로벌 라이브러리로 관리해야 되는걸까? 특정 애플리케이션마다 필요한 라이브러리나 버전이 다를수도 있다. 그때마다 버전을 변경하거나 삭제하고 추가해야 되는걸까? 이런 문제들을 해결해줄 수 있는 도구가 바로 **파이썬** 독립 실행환경 구성 도구인 `virtualenv` 이다.
## What is virtualevn ?
**파이썬**의 독립된 실행환경을 만드는 도구이다. 각 구성된 환경마다 서로 독립된 버전의 **파이썬** 버전을 간단한 명령어로 지정해서 사용하도록 하고, 라이브러리 저장 디렉토리인 `site-packages` 또한 각 환경간에 간섭없이 독립적으로 구성한다. 필요하다면 설정을 통해 글로벌 라이브러리를 참조하지 않도록 할 수도 있다.
이름에 **Virtual** 이라는 단어가 사용되면서 마치 가상환경을 새롭게 구성하는 것 처럼 느껴지지만 하이퍼바이저나 리눅스 컨테이너를 사용하는 가상화 기술은 아니다. 이름 때문에 **가상환경**이라고 불리기도 하지만 가상화 기술은 아니다. 마치 가상의 환경을 여러개 만들어 사용하는 것 처럼 느끼도록 독립된 환경을 구성해주는 도구로 받아들이면 된다.
이처럼 `virtualenv`는 독립된 실행환경을 지원하는 유용한 도구이다. `virtualenv` 를 사용하면 다음과 같은 장점이 있다.
##
**장점:**
* 개발환경과 실서버환경을 동일하게 맞출 수 있다.
* 공동작업자들과 동일한 환경을 공유하면서 로컬에서 다른 환경을 구성할 수도 있다.
* 파이썬 패키지를 설치할 때 관리자가 아닌 사용자(user)권한으로 설치할 수 있다.
* 파이썬의 실행 환경을 리눅스의 기본환경과 온전히 구분할 수 있다.
* python2 를 사용하면서도 python3 를 python 명령어로 실행할 수 있다.
# Installation
## using pip
`pip`를 이용해서 설치한다.
```bash
$ sudo pip install virtualenv
$ sudo pip install virtualenvwrapper
```
> 코어기능을 지원하는 `virtualenv`외에 `virtualenvwrapper`를 설치했는데, 해당 라이브러리르는 보다 편리한 명령어로 `virtualenv`를 사용할 수 있도록 도와주는 보조 라이브러리이다.
## Configuration
이제 설정을 해보자. 독립환경 작업 디렉토리인 `.virtualenvs`를 만들어야 한다. 사용자 홈 디렉토리 하위 적당한 곳에 만들면 된다.(반드시 해당 위치일 필요는 없으며, 루트권한 없이 환경을 구성하고 라이브러리를 관리할 수 있도록 사용자 홈 디렉토리를 선택한 것일 뿐이다.)
```bash
$ mkdir ~/.virtualenvs
```
이제 생성한 작업 디렉토리를 환경변수 `WORKON_HOME`에 등록해준다.(위에서 생성한 `.virtualenvs`의 경로를 말한다.)
##
__~/.profile__
```bash
export WORKON_HOME=~/.virtualenvs
```
> 사용자 의존적으로 사용할 생각이므로 홈 디렉토리 밑에 `.profile`에 등록했다.
앞서 우리는 보조 라이브러리인 `virtualenvwrapper`를 설치했다. 활성화될 수 있도록 `.profile` 에 임포트 해준다. 가장 하단에 다음의 스크립트를 추가해줬다.
##
__~/.profile__
```bash
. /usr/local/bin/virtualenvwrapper.sh
```
> 실제 `virtualenvwrapper.sh`의 경로를 지정해주길 바란다.
설정이 완료되었으니 모든 변경사항을 적용해준다.
```bash
$ source ~/.profile
$ source /usr/local/bin/virtualenvwrapper.sh
```
> `bash`의 `source` 명령어를 사용해서 변경된 내용이 `shell`에 적용될 수 있도록 해준다. 이렇게 함으로써 새로 지정한 환경변수가 현제 `shell`에 포함되게 된다.
# Using
## 새로운 독립환경 만들기
설치와 적용을 잘 끝마쳤다면 `virtualenvwrapper.sh` 내에 있는 함수인 `mkvirtualenv` 함수를 사용해서 쉽게 새로운 독립환경을 만들 수 있다.
```bash
$ mkvirtualenv {name}
```
> 독립환경 생성 `{name}` 에 원하는 이름을 지정한다.
**py2**라는 이름의 독립환경을 만드는 예제이다. (아무런 옵션을 주지 않았으므로 기본설정으로 독립환경을 만든다.)
```bash
$ mkvirtualenv py2
```
> 본 문서를 작성할 당시 리눅스에는 **파이썬** `2.7.x` 버전이 설치되어 있었고 기본 버전으로 환경변수에 등록되어 있었으므로 당연히 `py2` 환경은 `2.7.x`(본인이 구성한 기본버전) 버전의 새로운 독립환경으로 구성된다.
## 다른버전이 필요해! Python3 독립환경 만들기
앞에서 설명한 방법을 사용할 경우 기본적으로 `2.7.x` 버전으로 독립환경이 만들어진다. `3.x` 버전으로 독립환경을 만들 필요가 생긴다면 기존에는 버전을 업그레이드 하거나 아니면 손수 복잡한 작업들을 했어야 하지만 `virtualenv`를 사용하면 다음과 같이 할 수 있다.
```bash
mkvirtualenv {name} --python={python3-path}
```
> 사용할 **파이썬** 인터프리터 버전 지정해서 독립환경 만들기. 각 사용할 **파이썬** 버전은 설치된 경로를 각자의 환경에 맞게 사용해야 한다. `{python3-path}`에 실제 경로를 인자값으로 넘겨주어야 하며, 보다시피 반드시 `3.x` 버전대를 사용할 때만 유효한건 아니다. 정확히는 원하는 인터프리터 버전을 지정하는 옵션이다.
**mkvirtualenv --help** 명령어로 도움말을 출력하면 `--python` 옵션에 대한 설명을 확인할 수 있다. 이 옵션은 독립환경을 만들기 위해 사용할 **파이썬** 특정 버전의 인터프리터를 지정하는 것이다. 아무런 값을 주지않을 경우 기본값으로 `/usr/bin/python`을 참조해서 만들어진다. 앞의 경우에 기본으로 설정된 파이썬의 버전이 `2.7.x` 대 버전이었던 것이다. 만약 기본적으로 `3.x`를 사용하면서 기본 파이썬을 `3.x`로 해놓았다면 추가 옵션으로 인자를 넘기지 않아도 `3.x` 버전의 독환경이 만들어졌을 것이다.
**py3**라는 이름의 독립환경을 만드는 예제이다.(`3.x` 버전의 인터프리터가 정상적으로 설치되어 있어야 하는건 당연한 얘기다)
```bash
$ mkvirtualenv py3 --python=`which python3`
```
> `which` 명령어는 특정명령어의 위치를 찾아준다. 설치된 `3.x` 버전대의 인터프리터가 `python3`인 경우에 유효하며, 각 환경마다 다를 수 있으므로 실제 경로를 값으로 주어도 된다.
고정적으로 항상 같은 인터프리터의 **파이썬** 버전을 사용하고 싶다면, 시스템의 기본 **파이썬**을 변경하는 방법도 있지만 환경변수 설정을 통해 이를 고정할 수도 있다. `VIRTUALENV_PYTHON`환경변수를 설정해주면 된다.
```bash
export VIRTUALENV_PYTHON=`which python3`
```
> 이렇게하면 독립환경을 만들 때 별다른 옵션을 주지 않을경우 `python3` 인터프리터를 이용해서 환경을 구성하게 된다.
## 확인하기
독립환경을 만드는데 성공하면 자동으로 독립환경으로 진입하게 된다. 이 때 제대로 독립환경으로 들어온게 맞는지 확인하는 방법은 리눅스 `which` 명령어를 사용하는 것이다.
```bash
$ which python
```
다음과 같은 결과가 나오면 독립환경에 제대로 진입됐다고 할 수 있다.
```bash
/home/user_name/.virtualenvs/py2/bin/python
```
> 실제로 사용되고 있는 인터프리터의 경로가 변경된 것을 알 수 있다. 우리 생성한 독립환경 구성 작업 디렉토리 하위에 `py2` 환경에 접근했음을 확인하자.
## 들어가기/나가기
```bash
$ workon {name}
```
>특정 독립환경 들어가기.
```bash
$ workon py2
```
> **py2**라는 이름의 독립환경에 들어가기.
```bash
$ deactivate
```
> 독립환경 빠져나가기
# Conclusion
현재 **파이썬**은 `2.7.x` 버전과 `3.x` 버전으로 넘어가는 과도기에 놓여있다. 그러면서 다양한 테스트나 작업을 수행할 때 새로운 버전에서의 작업을 로컬에서 수행하고 싶을 때, 매번 귀찮게 버전을 변경해가면서 사용할 수는 없는 노릇이다. 또 공유된 작업별로 모두가 동일한 버전의 라이브러리 정보를 사용할 수도 있고, 개인적인 영역의 작업환경을 만들 수도 있다. 한번 작업환경을 구성해 놓으면 그때부턴 편하게 사용할 일만 남은 것이니 **파이썬**을 사용한 개발을 진행한다면 독립환경 구성을 위한 도구인 `virtualenv`를 사용하는 것이 보다 편리하고 유용할 수 있다.
# 바깥고리
* [virtualenv.pypa.io](https://virtualenv.pypa.io/en/stable/#)
* [virtualenvwrapper.readthedocs.io](https://virtualenvwrapper.readthedocs.io/en/latest/)