[Python] pyenv, conda, virtualenv, pip, autoenv Develop Tip

맥이나 리눅스는 기본적으로 파이썬 인터프리터가 들어 있습니다.

따라서 터미널에서 

$ python -V

해보면 버전을 보여줄 것입니다. (버전1에서는 -V 옵션이 없었네요 ^^)

그런데 말입니다.
파이썬을 개발하다 보면 많은 3-rd party 모듈을 설치하고는 합니다.
처음에는 소스 째 가져다가 

$ easy_install 
등의 명령을 사용하기도 했는데 지금은 거의 사용되지 않고,

$ sudo python setup.py install
명령을 이용해서 자신의 컴에 직접 설치해서 사용하기도 하였습니다.

PIP

그러던 것이,
Perl의 CPAN, node의 npm, ruby의 gem 등과 같은 패키지 관리자가
생겨 원격으로 서드파티 모듈을 올리고 다운받고 업데이트 하는 등의
파이썬용 패키지 관리자가 생겼는데 바로, pip 입니다.

PyPI - the Python Package Index 가 바로 그 해당 사이트 입니다.


그런데 이렇게 시스템 디폴트 파이썬 인터프리터에 
제삼 모듈을 마구잡이로 설치하다보면 아주 지저분하게 됩니다.
언제 어떻게 어느 모듈이 실제 해당 기능에 이용되었는지도 
모호하게 되지요.

pip는 우분투 같은 경우에는
$ sudo apt-get install python-pip
처럼 설치하지만,

대부분,

$ sudo python get-pip.py
$ rm get-pip.py

처럼 설치하면 됩니다.


이런 문제점을 해결하고자,

Virtualenv

가 등장했습니다. (예전에 한번 다룬적이 있습니다)

우선 viutualenv를 실행시키기 위하여 시스템 인터프리터로 다음과 같이

$ sudo pip install virtualenv
설치하면 됩니다.

$ virtualenv -p python3 $HOME/py3

위와 같은 방식으로 $HOME/py3 폴더에 sudo가 아니더라도
자신만 이용할 수 있는 독립환경으로 파이썬 인터프리터를 구동시키게
만들 수 있습니다.

$ . $HOME/py3/bin/activate
(py3) $
라는 식으로 해당 환경으로 가두어 버립니다.

(py3) $ which python
~/py3/bin/python

(py3) $ which pip
~/py3/bin/pip

등으로 모든 환경이 해당 환경으로 되지요.

이제부터 개발되는 것이나
(py3) $ pip install ...
라고 설치하는 모듈들은 모두 해당 환경하($HOME/py3 아래)에 놓이게 됩니다.

PyCharm에서 해당 인터프리터는
~/py3/bin/python 으로 지정하면 알아서 가상환경임을 인식합니다.

(py3) $ deactivate
$
라고 하여 해당 환경을 빠져 나옵니다.

(필요없으면)
$ rm -rf $HOME/py3
라고 해당 가상환경을 모두 날릴 수 있습니다.

conda

지난번에 conda에 대한 고찰에서 살펴본 바와 같이,
virtualenv 개념을 확장해서 conda를 사용할 수 있습니다.

사실 콘다 (아나콘다, 미니콘다) 자체는 파이썬 뿐만 아니라 다른 언어도 포함하도록 되어 있지만,
파이썬만 살펴보도록 하겠습니다.

$ conda create -n py35 python=3.5
처럼 py35 라는 환경을 만들고,

$ source activate py35
(py35) $
처럼 해당 환경으로 바꾸어 작업한 다음

(py35) $ conda install ...
처럼 필요 패키지를 설치해서 작업합니다.
(pip install 로 특정 파이썬 모듈을 설치해도 됩니다)

(py35) $ source deactivate
$

라고 해서 해당 환경을 빠져나와도 됩니다.

해당 환경을 다 지우고 싶으면,

$ conda remove -n py35 --all
와 같이 하면 됩니다.


pyenv

이제 오늘의 주제로 넘어와서 pyenv 라는 것이 있습니다.
이것은 위의 conda 도 포함하는 더 상위 개념으로 이해하시면 됩니다.

맥에서의 설치는,

$ brew install pyenv pyenv-virtualenv
라고 하면 되고,

우분투 (16.04)등에서는
$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev git
와 같이 가져오면 끝입니다.

그리고, 

export PYENV_ROOT="$HOME/.pyenv
export PATH="$PYENV_ROOT/bin:$PATH"

위의 내용을 $HOME/.bashrc 또는 .bash_profile
에 넣어줍니다. (brew는 알아서 들어갑니다)

그 다음 다음의 내용이 .bashrc 또는 .bash_profile 에 추가되면 됩니다.

eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

위와 같이 주고, 다시 터미널을 뛰워,

$ pyenv
pyenv 1.1.3
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme

와 같이 나오면 설치가 잘 된 것입니다.

이제는 간단한 작업을 해 봅니다.

우선 
$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  ...

위의 명령으로 설치가능한 파이썬을 찾아, 필요한 것을 아래와 같이 설치합니다.
(CPython 뿐만 아니라 pypy를 비롯하여 많은 다양한 파이썬 구현체를 선택하여 설치할 수 있습니다)

$ pyenv install 3.6.2

라고 하여 특정 파이썬을 설치하고,

$ pyenv versions
  system
* 2.7.13 (set by /Users/mcchae/.pyenv/version)
  3.6.2

위와 같이 설치된 버전을 확인합니다.

이제 설치한 파이썬을 이용하여 특정 가상환경을 만들어봅니다.

$ pyenv virtualenv 3.6.2 py36
위의 내용은 C파이썬 3.6.2 버전을 이용하여 py36 이라는 닫힌 가상환경을 만든 것입니다.

$ pyenv virtualenvs
  2.7.13/envs/py27 (created from /Users/mcchae/.pyenv/versions/2.7.13)
  3.6.2/envs/py36 (created from /Users/mcchae/.pyenv/versions/3.6.2)
  miniconda3-4.3.11 (created from /Users/mcchae/.pyenv/versions/miniconda3-4.3.11)
  py27 (created from /Users/mcchae/.pyenv/versions/2.7.13)
  py36 (created from /Users/mcchae/.pyenv/versions/3.6.2)

처럼 모든 가상환경을 확인할 수 있습니다.

위의 결과로 나온 것을 가지고 해당 가상환경으로 들어가려면,

$ pyenv activate py36
(py36) $

이라고 하여 작업을 합니다.

위에서 처럼 일반 인터프리터인 경우에는,
해당 가상환경에서 다른 가상환경처럼 pip  로 작업하면 됩니다.
하지만, 제가 conda 까지 포함한 것이 pyenv 라고 하였는 데요.

$ pyenv install miniconda3-4.0.5
와 같이 (miniconda 뿐만 아니라 Anaconda 도 있는데 $ pyenv install --list 명령으로 확인 가능합니다)
conda 를 설치합니다.

$ pyenv virtualenv miniconda3-4.0.5 conda3
위에 처럼 conda3 라는 가상환경을 만들었고,

$ pyenv activate conda3
위에 처럼 해당 가상환경으로 설정합니다.

이제는 다음과 같이,

(conda3) $ conda info
...
conda 명령이 동일하게 먹습니다.

(conda3) $ conda create -n cpy34 python=3.4.0
conda로 cpy34 라는 가상환경을 생성하였는데요,

(conda) $ pyenv virtualenvs
* conda3 (created from /home/toor/.pyenv/versions/conda3)
  miniconda3-4.0.5 (created from /home/toor/.pyenv/versions/miniconda3-4.0.5)
  miniconda3-4.0.5/envs/conda3 (created from /home/toor/.pyenv/versions/miniconda3-4.0.5/envs/conda3)
  miniconda3-4.0.5/envs/cpy34 (created from /home/toor/.pyenv/versions/miniconda3-4.0.5/envs/cpy34)

위와 같이 확인하여,

(conda3) $ pyenv activate miniconda3-4.0.5/envs/cpy34
(miniconda3-4.0.5/envs/cpy34) $ python -V
3.4.0
해당 가상환경으로 옮겨다닐 수 있습니다.

이제는 conda를 이용하여 작업해 봅니다.

(miniconda3-4.0.5/envs/cpy34) $ conda remove jupyter
...

이렇게 하면 원하는 임의의 pyenv용 인터프리터로 conda를 선택하고,
해당 conda에서 또 원하는 파이썬 버전을 골라 작업할 수 있습니다.
(conda에서는 심지어 파이썬 버전 1도 포함하고 있습니다)


작업을 마친 다음에는

(py36) $ pyenv deactivate
$
라고 하여 해당 가상환경을 나옵니다.

만약 해당 virtualenv를 삭제하려면,

$ pyenv uninstall py36
이라고 하면 됩니다.

해당 인터프리터까지 삭제하려면,

$ pyenv uninstall 3.6.2
라고 하면 됩니다.


약간 주제를 벗어나 pyenv 이야기 지만, 
만약 PyCharm에서 위의 가상환경의 python 을 지정하기 위하여

(cv2) $ which python
명령을 내리면, 그 결과는
/Users/mcchae/.pyenv/shims/python

와 같이 나옵니다. (위의 파이썬은 해당 환경으로 이동하기 위한 또 다른 shell script 였구요)
결국 다음과 같이 해서 해당 파이썬 인터프리터 패스를 구했습니다.

(cv2) $ pyenv which python
/Users/mcchae/.pyenv/versions/cv2/bin/python


결국 파이썬의 현재까지 나와있는 거의 모든 패키지 방법을 훑어 보았습니다.
차근 차근 하나씩 이해하다 보면 잘 사용하실 수 있을 것입니다.

마지막으로 작은 유틸리티로 

autoenv

를 살펴보겠습니다.

위의 작은 툴은 여러 파이썬 가상환경을 만들어 놓았는데,
이를 디렉터리를 옮겨 다닐때마다 어느 것을 선택할 지 지정하는것
자체가 일일 수 있는데 이를 위한 것입니다.

특정 폴더에 .env 라는 내용안에
pyenv activate conda3

와 같은 환경 설정 명령 (실은 임의의 쉘 명령이 가능합니다)을 주어
선택 환경으로 바꿀 수 있습니다.

설치방법은 

$ git clone git://github.com/kennethreitz/autoenv.git ~/.autoenv
이라고 지정하고,

$HOME의 .bashrc(우분투) 또는 .bash_profile (맥, alpine 리눅스 등)

source ~/.autoenv/activate.sh
가 포함 되어 있으면 됩니다.



어느 분께는 도움이 되셨기를...

핑백

  • 지훈현서 : [Docker] 개발 환경으로써 Docker 이용해 보기 2017-12-01 17:42:26 #

    ... 만약 화면을 웹브라우져에 꽉 차게 스케일링을 하고 싶으면 위에처럼 "Local Scaling" 을 선택하면 됩니다. pyenv로 작업을 하면 되는데, 자세한 것은 해당 블로그를 참고합니다. 위에 창에서 처럼 py3을 virtualenv로 만들었다가 uninstall 을 하였는데 잘 되었습니다.(예전 toor 환경에서는 uninst ... more

덧글

  • dd 2018/02/02 14:57 # 삭제 답글

    정말 제일 잘 정리되있는것 같아요 감사합니다 !
  • 지훈현서아빠 2018/02/04 12:07 #

    도움이 되셨다면 저의 보람입니다~ ^^
  • 지나가다 2018/07/03 00:30 # 삭제 답글

    $ pyenv versions
    3.7.0
    conda3
    miniconda3-4.3.30
    miniconda3-4.3.30/envs/conda3

    $ pyenv activate conda3
    $ pyenv-virtualenv: version `conda3' is not a virtualenv

    마지막 문장처럼 나오는데 뭐가 문제일까요? 검색을 해봐도 못 찾다 여기까지 왔네요.
  • 지훈현서아빠 2018/07/03 10:09 #

    좋은 방법은 지웠다가 다시 생성해 보는 거 아닐까요?

    pyenv uninstall conda3
    (혹시 모르니 ..)
    pyenv uninstall miniconda3-4.3.30/envs/conda3

    한번 해 보심이..
  • 지나가다 2018/07/03 12:37 # 삭제 답글

    당연히 해 봤지요. ㅜㅜ
  • 지훈현서아빠 2018/07/04 13:07 #

    저는 비슷한 경험으로 pyenv 용 리눅스 컨테이너를 만들어
    그 컨테이너를 윈도우에서 돌리면서 $HOME/.pyenv 를 볼륨 마운트해서
    사용하는데 윈도우의 권한 문제 때문인지 문제가 생기더군요..
    아예 안지워지고 하면 $HOME/.pyenv/versions 아래에 해당 내용을
    권한도 살펴보시고 해서
    sudo rm -rf conda3
    같이 함 해 보심이
  • ㅇㅇ 2018/10/05 15:58 # 삭제 답글

    정말 최고로 잘 정리되있는글이네요! 감사합니다 :)
  • 지훈현서아빠 2018/10/08 09:39 #

    그렇게 생각해 주시니 감사합니다. ^^
댓글 입력 영역

구글애드텍스트