anyenvによるPython環境構築

# anyenvによるPython環境構築
以前書いた、[Python開発環境構築](https://qiita.com/kazuya-s@github/items/5d77bc5647dec8780251) の内容を anyenvを使って内容更新します。
動作確認のため、クリーンインストールしたmacOS High SierraにPython環境を構築しようと思ったら一部ハマったので、その原因と解決方法も記載しました。

## 目的
Mac上に以下の条件を満たすPython環境を構築します

+ 複数バージョンのPythonを切り替えられること
+ プロジェクトごとにパッケージを分離できること
+ Python 以外でも**envが使用できるように準備しておく

## 環境
+ macOS High Sierra (10.13) クリーンインストール
+ zsh
+ Homebrew(1.3.6) インストール済み

※ bash を使っている人は .zshrc を .bashrc と置き換えて読んで下さい

## ツール説明
+ [pyenv](https://github.com/pyenv/pyenv)
複数バージョンのPythonを簡単に切り替えられるようにするツール。rbenvとruby-buildからフォークしてPython用に変更されました。

+ [virtualenv](https://github.com/pyenv/pyenv-virtualenv)
分離されたPython環境を作成るためのツール。環境ごとに違うパッケージを入れることができます。

+ [anyenv](https://github.com/riywo/anyenv)
** env（rbenv, pyenvなど）のラッパー。
anyenvを入れておけば、**envごとにシェルプロファイルを変更したりする必要がなくなります。

## インストール
### anyenvインストール

```shell-session
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc
$ exec $SHELL -l
```

### anyenv-updateプラグインインストール

```shell-session
$ mkdir -p $(anyenv root)/plugins
$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
```

### pyenvインストール

```shell-session


$ anyenv install pyenv
$ exec $SHELL -l
```

### Pythonインストール

```shell-session
インストールに必要なソフトのインストール
$ brew install readline xz

インストール可能なバージョン一覧を表示
$ pyenv install -l

指定したバージョンのPythonをインストール
$ pyenv install -v 2.7.14

ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
https://github.com/pyenv/pyenv/wiki/Common-build-problems
```
エラーが出たので、URLのページにかかれているオプションを追加して再度インストールしてみます。

```shell-session
$ CFLAGS="-I$(brew --prefix openssl)/include" \
  LDFLAGS="-L$(brew --prefix openssl)/lib" \
  pyenv install -v 2.7.14

ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
https://github.com/pyenv/pyenv/wiki/Common-build-problems
```
同じエラーが表示されます。

念のためCFLAGS、LDFLAGSのパスを確認してみると、ファイルがありません。

```shell-session
$ ls $(brew --prefix openssl)
lib
```
opensslを再インストールします。

```shell-session
$ brew uninstall openssl
$ brew install openssl

$ ls $(brew --prefix openssl)
CHANGES			NEWS			include
INSTALL_RECEIPT.json	README			lib
LICENSE			bin			share
```
今度は必要なファイルがインストールされました。
この状態で先程のコマンドを実行すると無事にインストールが完了します。

```shell-session
$ CFLAGS="-I$(brew --prefix openssl)/include" \
  LDFLAGS="-L$(brew --prefix openssl)/lib" \
  pyenv install -v 2.7.14

Installed Python-2.7.14 to /Users/kazuya/.anyenv/envs/pyenv/versions/2.7.14

インストールされているバージョンを表示
$ pyenv versions
* system (set by /Users/kazuya/.anyenv/envs/pyenv/version)
  2.7.14
```

### pyenv-virtualenvインストール
```shell-session
$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc
$ exec "$SHELL"
```

これで必要なソフトはインストール完了です。

## 仮想環境の使い方

### 仮想環境の作成
python 2.7.14 の仮想環境、myenv2_7_14を作成する場合

```shell-session
$ pyenv virtualenv 2.7.14 myenv2_7_14
```

pyenvのversionに登録されることが確認できます

```shell-session
$ pyenv versions
* system (set by /Users/kazuya/.anyenv/envs/pyenv/version)
  2.7.14
  2.7.14/envs/myenv2_7_14
  3.6.3
  myenv2_7_14
```

### フォルダに仮想環境をセット

project-aフォルダにmyenv2_7_14の環境をセットする場合

```shell-session
$ mkdir project-a
$ cd project-a
$ pyenv local myenv2_7_14
```

project-aフォルダに移動すると、自動的にmyenv2_7_14の環境となる

```shell-session
$ cd project-a
(myenv2_7_14)$ python --version
Python 2.7.14

(myenv2_7_14)$ cd ..
$ python --version
Python 2.7.10
```

### 仮想環境の削除

myenv2_7_14を削除する場合

```shell-session
$ pyenv uninstall myenv2_7_14
pyenv-virtualenv: remove /Users/kazuya/.anyenv/envs/pyenv/versions/2.7.14/envs/myenv2_7_14? yes
```