pythonバージョン管理システムがよくわからない人のための環境構築手順

# 環境

* macOS Sierra version 10.12.1
* Python 2.7.10

# 前提

* homebrewがインストールされていること

# pyenvとvirtualenvとpyenv-virtualenv

pythonの環境を整えるに当たって、pythonのバージョン管理について調べていたのですが、virtualenvとpyenv-virtualenvでだいぶ混乱していました。

そんな時に見つけたのがこの記事です。大変わかりやすくスッキリしました。

* [[Python]pyenvとvirtualenvとpyenv-virtualenv](http://dackdive.hateblo.jp/entry/2015/12/12/163400)

自分でもまとめてみます。

pyenv-virtualenvとvirtualenvは別物であり、組み合わせは次の２通りが考えられる。

* pyenv + pyenv-virtualenv
* pyenv + virtualenv

例えばprojectA,projectB,projectCで別々のpython環境を使いたい時に、pyenv-virtualenvを使った場合は環境が３つともHOMEディレクトリに作られ、それを各々のプロジェクトから参照する。virtualenvを使った場合は、python環境は各プロジェクト内に作られる。という事だと思う。

virtualenvはプロジェクトのディレクトリで完結していて良いが、毎度環境をactiveにしないといけないのが面倒。
pyenv-virtualenvはプロジェクトディレクトリに入ったら自動的に環境が適用されるから楽だけど、環境がHOMEディレクトリ配下に作られるのがちょっと気持ち悪い。だって別のプロジェクトから同じ環境を使いたいことってあんまりないでしょ。

というわけで、pyenv + virtualenvを使うことにした。

# pyenv

## pyenvのインストール

homebrewでpyenvをインストールします。

```{bash}
$ brew install pyenv
```

`.bash_profile`などに次の設定を追加します。

```{bash:.bash_profile}
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```

## 別バージョンのインストール

pythonの最新バージョンをインストールしてみます。

`pyenv install -l`でインストール可能なバージョンの一覧を確認できます。2系と3系の最新バージョンをインストールしてみます。

```{bash}
$ pyenv versions
* system (set by /Users/clutter/.pyenv/version)
$ pyenv install -l
$ pyenv install 2.7.12
$ pyenv install 3.5.2
$ pyenv versions
* system (set by /Users/clutter/.pyenv/version)
  2.7.12
  3.5.2
```

`2.7.12`と`3.5.2`がインストールできました。

## バージョンの切り替え

pyenvでバージョン切り替えてみます。

```{bash}
~$ pyenv version
system (set by /Users/clutter/.pyenv/version)
~$ python -V
Python 2.7.10

## globalバージョンの変更
~$ pyenv global 3.5.2
~$ pyenv version
3.5.2 (set by /Users/clutter/.pyenv/version)
~$ python -V
Python 3.5.2

## 特定ディレクトリでの変更
~$ mkdir pytest
~$ cd !$
pytest$ pyenv local 2.7.12
pytest$ pyenv version
2.7.12 (set by /Users/clutter/pytest/.python-version)
pytest$ python -V
Python 2.7.12
pytest$ cd ..
~$ pyenv version
3.5.2 (set by /Users/clutter/.pyenv/version)
~$ python -V
Python 3.5.2
```

homeディレクトリとpytestディレクトリでバージョンが切り替わっていることが確認できます。
localのバージョンは、そのディレクトリに作成される`.python-version`に記録されているようです。

```{bash}
pytest$ ls -a
.               ..              .python-version
pytest$ cat .python-version
2.7.12
```

# virtualenv

## virtualenvのインストール

pyenvでインストールしたバージョンに切り替えると`pip`が使えるのでそれでインストールします。

```{bash}
$ pip install virtualenv
```

## 仮想環境の作成

仮想環境を作成して、Flaskをインストールしてみます。

```{bash}
$ pip list
pip (8.1.1)
setuptools (20.10.1)
virtualenv (15.1.0)

# 新しい仮想環境venvtestを作成
$ virtualenv venvtest
New python executable in /Users/clutter/venvtest/bin/python2.7
Also creating executable in /Users/clutter/venvtest/bin/python
Installing setuptools, pip, wheel...done.
$ ls
venvtest
$ cd venvtest

# 仮想環境を有効にする
$ source bin/activate
# 仮想環境でパッケージをインストール
(venvtest) $ pip install Flask
(venvtest) $ pip list
click (6.6)
Flask (0.11.1)
itsdangerous (0.24)
Jinja2 (2.8)
MarkupSafe (0.23)
pip (9.0.1)
setuptools (30.4.0)
Werkzeug (0.11.11)
wheel (0.29.0)

# 仮想環境を抜ける
(venvtest) $ deactivate
$ pip list
pip (8.1.1)
setuptools (20.10.1)
virtualenv (15.1.0)
```

仮想環境を抜けるとFlaskがインストールされていない事が確認できます。
仮想環境を作る時に`--no-site-packages`をつけると、globalにインストールされたパッケージを無視して綺麗な状態で環境を作ってくれるらしいのでこのオプションは覚えておいた方が良さそう。

## pythonのバージョンを指定して環境を作る場合

`--python`オプションを指定して作成する

```{bash}
virtualenv venv --python=~/.pyenv/versions/3.5.2/bin/python3
```

`--python=python3.5.2`としても良いが、anacondaもインストールされているとどっちのpython3かわからないと言われる

# うまくいかない時

この辺が原因かもしれない。

* `.bash_profile`の設定が読み込まれていない
* pythonがpyenvより先にPATHに設定されている
    * [pyenvでPythonがSystemバージョンから切り替わらない時の対処](http://qiita.com/ta_ta_ta_miya/items/e24394c6b0022405a126)

# 参考

* [[Python]pyenvとvirtualenvとpyenv-virtualenv](http://dackdive.hateblo.jp/entry/2015/12/12/163400)
* [pyenvでPythonがSystemバージョンから切り替わらない時の対処](http://qiita.com/ta_ta_ta_miya/items/e24394c6b0022405a126)
* [pyenv, virtualenvの仕組み](http://qiita.com/Neetless/items/160fcc126c17590b664a)