数年前に作ったpythonの開発環境を最適化する

私の開発環境は数年前にpythonを触ったきりそのまま放置していたので、開発するにはしのびない状態でした。
そこで、標準的なpythonの開発環境に再構築し直しました。
取り上げる内容は、既に飽和気味かと思いますが備忘録の意味も込めています。

## この記事で得られること　
- pythonの開発環境作成に必要な知識が得られる　　　
- プロジェクト毎にpythonのバージョンを管理できる。

## イントロダクション
### 作業の流れ
1. pyenvで安定版のPythonをインストール
2. pyenv-vertualenvでプロジェクト用のpyenvのバージョンを作成
3. プロジェクトディレクトリに適用

### 開発環境
- MacOS High Sierra(10.13.2)を使用
    - pyenv自体はインストールは数年前にインストール済み。

### キーワード
- pip
- pyenv
- pyenv-vertualenv


## pyenvで安定版のPythonをインストール
pythonの安定板は2017年12月現在では「3.6.4」だったのですが、ローカルのバージョンは「3.5.1」でした。
最新の安定版で開発するに越した事はなにので、新しいバージョンをインストールします。

### pyenvでインストールできるpythonのバージョンが低い？
pyenvでインストール可能なバージョンを確認して見ても低いバージョンしかインストールできませんでした。

``` sh
$ pyenv install --list
... 省略 ...
3.5.1
3.6.0.dev
anaconda-1.4.0
... 省略 ...
```

そのため、pyenv自体のアップデートを行います。
pyenvはgitで管理されているのでcloneすれば良いのですが、今回は[pyenv-update](https://github.com/pyenv/pyenv-update)を使用します。
これで、pyenvのコマンドに含めてしまうこともできます。

``` sh
$ git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update
$ pyenv update
```

### 最新版のzlibライブラリが足りなくてインストールできない？
pyenvをアップデートしたことで、``` pyenv install --list ```に安定版が表示されました。
次に目的のバージョンのpythonをインストールをします。
しかし、インストールが失敗してしまいます。

``` sh
$ pyenv install 3.6.4
... 処理中 ...

zipimport.ZipImportError: can\'t decompress data; zlib not available
make: *** [install] Error 1
```

どうやら、[zlib](https://ja.wikipedia.org/wiki/Zlib)が実行できる環境では無いようです。
zlib自体は別途インストールする方法もありますが、macで開発を行う場合はxcodeの[Command line tools](https://developer.apple.com/library/content/technotes/tn2339/_index.html)をインストールする方法が主流のようです。
「Command line tools」はXcodeのサービス（ツール？）の一つで、開発に必要な最小限のCLIのライブラリをインストールしてくれます。

### Command line toolsをインストール
ドキュメントには下記と記載されています。

```
Install the Command Line Tools package via the Terminal application
You can install the Command Line Tools package by running the xcode-select --install command.
```

CLIの場合は``` xcode-select --install ```コマンドでインストールできると書いているのでコマンドで実行します。

``` sh
$ xcode-select --install
```

実行すると、ポップアップでインストール許可を聞かれるので続行します。

### 再度新しいバージョンをインストール
しばらくするとインストールが完了しますので、終わったら再度最新版のpythonをインストールします。

``` sh
$ pyenv install 3.6.4
Installed Python-3.6.4 to /Users/<username>/.pyenv/versions/3.6.4

## インストールが完了したら、実際に追加されたか確認。
$ pyenv versions
system
2.7.11
* 3.5.1 (set by /Users/<username>/.pyenv/version)
3.6.4
```

## pyenv-vertualenvでプロジェクト用のpyenvのバージョンを作成
この時点で、pythonのバージョンをディレクトリ単位で変える事はできます。
しかし、バージョン毎に切り替えを行うので、``` pip ```コマンドでインストールしたライブラリは共有されてしまいます。

もし、2つのプロジェクトがあって、pythonのバージョンが同じだが、ライブラリがそれぞれ違う物を使用している場合はどうでしょうか？
仮にライブラリ間で干渉してしまうものがあった場合、構築の手間になってしまいます。

そこで、[pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv)を使ってバージョンを更に、個別のプロジェクトに分けられるようにします。
ちなみに、pyenv-virtualenvは<b>pyenvのプラグイン</b>であって、<b>[virtualenv](https://virtualenv.pypa.io/en/stable/)</b>とは別物です。

### インストール
macの場合は次の方法でインストールできます。
windowsの場合は、おそらくgitでcloneする方法になるかと思います。 　　

``` sh
$ brew install pyenv-virtualenv
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
```

### バージョンを複製
``` sh
## 先ほどインストールした3.6.4を複製して、「hogeproject」という名前にします。
$ pyenv virtualenv 3.6.4 hogeproject

## 念のため確認します。
$ pyenv versions
system
2.7.11
* 3.5.1 (set by /Users/<username>/.pyenv/version)
3.6.4
3.6.4/envs/hogeproject
hogeproject (set by PYENV_VERSION environment variable)
```

## プロジェクトディレクトリに適用
これでバージョンとプロジェクト毎に変えられるpythonの環境が作れるようになりました。
最後に、設定したいプロジェクトのディレクトリに作成したバージョンを指定します。

``` sh
$ cd <project directory>
$ pyenv local hogeproject
```

これで完了です。
``` pyenv local ```でバージョンを指定した場合、「.python-version」と言うファイルが自動生成されます。
もし、プロジェクトディレクトリをバージョン管理をしている場合は、個別環境用のファイルは除外しておいた方が良いです。