pyenv-virtualenvでディレクトリ単位のpython環境構築


ずっとPython2.7を愛用してきたが，人からもらった言語処理系のスクリプトがPython3を使用していたので，これを機に３.X系に乗り変えようとした．

乗り換える前に[2.X系と3.X系の違いを調べてみると](http://postd.cc/the-key-differences-between-python-2-7-x-and-python-3-x-with-examples/)，どうも思っていたのと違う．

結局どっち使い続けるのがいいのだろ？と思い，いろいろと漁ってみると[公式サイト](https://wiki.python.org/moin/Python2orPython3)に，「どのバージョンを使うかは，何をしたいかにほぼ依存する」といった記述があった笑．

そこで，ぼくも食わず嫌いしていたpyenvを使ってみることにした．

そんなこんなで，先駆者達の知恵を拝借し，自分の環境にpyenv-virtualenvを導入した時のメモを残しておく．

## pyenvとvirtualenv
- pyenv
 - Pythonのバージョン切り替えに使用
 - 基本的にPythonのバージョンごとに管理
 - 同一バージョンで複数のPython環境を管理不可能（パッケージが混在する）
 - 数値計算用のpython2.7.10と自然言語処理用のpython2.7.10にはならずpython2.7.10として数値計算ようのパッケージと自然言語処理用のパッケージが混在
- virtualenv
 - 仮想環境の構築に使用
 - 基本的にディレクトリ単位でpythonのバージョン，パッケージを管理
 - 数値計算用のpython2.7.10と自然言語処理用のpython2.7.10分けて使用可能


## 環境

- Mac Yosemite OS X 10.10.5
- Homebrew 0.9.5 (git revision 2134d3; last commit 2015-11-26)

## インストール
Homebrewを使ってpyenvとpyenv-virtualenvをインストールする．
Homebrewのインストールは[こちら](http://brew.sh/index.html)から．

```console
# pyenvのインストール
$ brew install pyenv

# pyenv-virtualenvのインストール
$ brew install pyenv-virtualenv
```

インストールが終わったら.bash_profileに下記を追加する．

```sh:.bash_profile
$ vim ~/.bash_profile

## Set path for pyenv
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
fi
```

設定を反映させるためにターミナルを再起動させるか，下記コマンドを打つ．

```console
$ source ~/.bash_profile
```


## pyenvによるpython3のインストール
まずは現行のpythonのバージョンを確認

```console
$ python -V
Python 2.7.10
```

冒頭でも述べたが，目的に合わせてインストールするのが良いそう．
今回は，参考資料と同様に3.4.3をインストールしてみる．

```console
# 適当にフォルダを作って移動
$ mkdir ~/work/pyenv_test
$ cd ~/work/pyenv_test

# python3.4.3のインストール
pyenv_test $ pyenv install 3.4.3
Downloading Python-3.4.3.tgz...
-> https://yyuu.github.io/pythons/4281ff86778db65892c05151d5de738d
Installing Python-3.4.3...
Installed Python-3.4.3 to /Users/XXXX/.pyenv/versions/3.4.3

# python3.4.3が導入されたか確認
pyenv_test $ pyenv versions
* system (set by /Users/XXXX/.pyenv/version)
  3.4.3
pyenv_test $ ls ~/.pyenv/versions
3.4.3
```

## pyenvによるpythonのversion設定
このままだと，元から入っているpythonのバージョンが反映されている

```console
$ pwd
/Users/XXXX/work/pyenv_test
$ python -V
Python 2.7.10
```

そこで，`pyenv local NAME`を使ってpyenvにダウンロードしたpythonのバージョンを反映する．

```console
$ pwd
/Users/XXXX/work/pyenv_test
$ pyenv local 3.4.3
$ pyenv versions
  system
* 3.4.3 (set by /Users/XXXX/work/pyenv_test/.python-version)
```

これでpyenv_testディレクトリにpyenvでインストールしたpython3.4.3が反映できた．


## pyenv-virtualenvによる仮想環境構築
pyenv-virtualenvでは，インストールするパッケージを隔離する環境を作る．

```console
pyenv_test $ pwd
/Users/XXXX/work/pyenv_test

# 上記のような環境を構築したいディレクトリ下で下記コマンドを実行
pyenv_test $ pyenv virtualenv 3.4.3 test
pyenv_test $ pyenv local test
pyenv-virtualenv: activate test

(test)$    # <- 設定したpyenv-virtualenvが()内に表示される

(test)$ pyenv versions
  system
  3.4.3
* test (set by /Users/XXXX/work/pyenv_test/.python-version)
```

これで，このディレクトリに移ってくるたびに，構築したtest環境が自動的に使用される．


## パッケージのインストール
pipを使ってパッケージを管理する．
pipは`pyenv install NAME`した時に同時にインストールされている．
今は何もしていないので，wheelだけが入っている．

```console
(test) pyenv_test $ pip freeze
wheel==0.26.0
```

個人的によく使うパッケージをインストールする．

```console
pip install numpy
pip install scipy
pip install pandas
pip install scikit-learn
pip install nltk
pip install matplotlib
pip install seaborn
pip install ipython
pip install jupyter
```

人によっては，matplotlibやjupyterなどでエラーが出るみたいだが，特にエラーもなくインストールが完了．

## インストールしたパッケージの保存
インストールしたパッケージはリストで保存しておける．
別プロジェクトに同じパッケージをインストールするときに楽できるのでメモ．

```console
# インストールしてあるパッケージをリストにするコマンド
$ pip freeze > mypckg.list

# リストにしたパッケージをインストールするコマンド
$ pip install -r mypckg.list
```

## 構築した環境の削除
構築した環境は`pyenv uninstall NAME`で削除可能．
この削除方法は，local指定した際に生成される環境名が書かれた.python-versionというファイルは削除されない．

```console
(test) pyenv_test $ pyenv versions
  system
  3.4.3
* test (set by /Users/XXXX/work/pyenv_test/.python-version)

(test) pyenv_test $ pyenv uninstall 3.4.3
(test) pyenv_test $ pyenv uninstall test
pyenv: remove /Users/XXXX/.pyenv/versions/test? [[yを入力]]
pyenv-virtualenv: deactivate test
pyenv: version `test' is not installed (set by /Users/XXXX/work/pyenv_test/.python-version)

pyenv_test $     # <- ()がなくなる
pyenv_test $ pyenv versions
 system
```

## まとめ
次回以降に環境を構築する場合，下記流れに沿って構築を行う．

```console
# pythonのインストール
$ pyenv install 3.4.3

# 環境構築
$ pyenv virtualenv 3.4.3 NAME

# 環境選択
$ pyenv local NAME
(NAME)$ pyenv versions
  system
  3.4.3
* NAME (set by /Users/XXXX/work/pyenv_test/.python-version)

# パッケージのインストール
(NAME)$ pip install -r mypckg.list

# 構築した環境を削除する場合
(NAME)$ pyenv uninstall NAME
```


## 参考

- [同一システム上でPython複数環境の構築](http://qiita.com/yuichy/items/8cd43a667fb4659d89e9)
- [MavericksでPythonのバージョン管理pyenvの設定をしてシステムではなくpyenvのPythonを使う](http://rikei-webmemo.hateblo.jp/entry/2014/06/21/102331)
- [Pythonのバージョン管理](https://syui.github.io/blog/2014/11/22/pyenv-python-install/)
- [Mac OSX yosemiteにpyenvとvirtualenv環境を構築](http://blog.shun-ichiro.com/howto/pyenv-virtualenv/)
- [Macでpyenv+virtualenv](http://qiita.com/maosanhioro/items/47a52f96fefba7126f9b)
- [pyenv virtualenvのメモ](http://kazsoga.com/pyenv-virtualenv-memo/)
- [pyenv および virtualenv の使い方](https://www.qoosky.net/references/263/)
- [食わず嫌いしてたpyenvを使ってみたら便利過ぎて腰を抜かした話](http://qiita.com/who_you_me/items/09f572c842b1c3fea015)
- [Pythonローカル開発環境の構築その2(pyenv-virtualenv, pip使い方編）](http://qiita.com/yuki_yasai_11/items/409cd4e4093fb6ffe410)