データサイエンティストを目指す人のpython環境構築 2016

# pythonの環境構築について

"python 環境構築"でググると20万件くらいヒットしますが、割と内容が古いです。
タイトルにはデータサイエンティストと書いてありますが、データサイエンティスト以外にもanacondaはおすすめです。

- 2.x or 3.x? 3.xは動かないライブラリが多いので2.x推奨 >　3.xで動かないライブラリがある、くらいまで来ました。
- easy_installでpipを入れて、setuptoolsも入れて、でもwheelというのもあって... > 古いです。
- virtualenv 必須 > そんなこともないです。
- winでは64bitは不具合が多いので32bit推奨 > 古いです。
- winでは[非公式バイナリ](http://www.lfd.uci.edu/~gohlke/pythonlibs/)からダウンロードしてインストール > お世話になりましたが、最近は使っていません。

# **2016版 OS毎python環境構築法決定版**

- [Windows](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#windows%E3%81%AE%E5%A0%B4%E5%90%88): **anaconda(or miniconda)**
- [linux](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#linux%E3%81%AE%E5%A0%B4%E5%90%88): git + pyenv + **anaconda(or miniconda)**
- [MacOS](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#mac%E3%81%AE%E5%A0%B4%E5%90%88): homebrew + pyenv + **anaconda(or miniconda)** #これだけ自分ではやったことないです
- [ChromeOS](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#chromeos%E3%81%AE%E5%A0%B4%E5%90%88): chromebrew + git + pyenv + **anaconda(or miniconda)**

重要なのは**公式のpythonは入れなくていい**ということです。

# python環境構築の課題

- 以前よりはマシになりましたが、用途や使用ライブラリによって2系と3系を使い分ける必要があります。
    - バージョン管理システムが必須: pyenvやpythonzなど
- 共存できないライブラリがあるとか、dev版の新しいライブラリを試したいとか、開発環境を使い分けたいケースがあります。
    - 環境管理システムが必須: virtualenvやpyvenv(python 3.4以降)など
- パッケージ管理システムが初心者泣かせ
    - スタンダードはpip(python package index)
    - python 3.3まではpipがプリインストールされていないので、setuptools（現在はdistribute）というパッケージ管理システムからインストールする...
        - パッケージ管理システムにパッケージ管理が必要ってなんだよ。Battery Includedじゃねーのかよ
        - もはやわけわからないです。[こちら](http://www.yunabe.jp/docs/python_package_management.html)のページが詳しいです。
- linuxやMacはプリインストールでpythonが入っているけど、ほとんどはpython 2.x
    - システムのpythonをバージョンアップしようとすると間違いなくはまります。
    - 結局 apt-get,yum,brewで複数バージョンのpythonを入れることになりますが、環境変数がコンフリクトしてはまります。
        - python3にpipでipythonをインストールしたけど使えない > 別のpythonにインストールしてました orz...

これらは環境構築法決定版ではほとんど気にしなくてよいです。

# Anacondaとは?
[Anaconda](https://www.continuum.io/why-anaconda)

- pythonのディストリビューションの一つで、主要ライブラリをオールインワンでインストールできます。(numpy,scipy,pandas,ipython,jupyter,scikit-learn etc...)
    - 最小限の構成しかない[miniconda](http://conda.pydata.org/miniconda.html)というのもあります。
- python 2.xも3.xも対応しています。(python 3.xは2014年の夏頃から)
- Linux版、Mac版、Win版とそろっています。
    - 32bitも64bitもあります。
- 似たようなものにenthoughtとかpython(x,y)とかありますが、全プラットフォーム&2/3対応しているのはAnacondaだけです。
 
## condaとは?
- condaというパッケージ管理システムが使えます。: **pipの代わり**
    - 対応パッケージは現時点で400オーバーです。
    - pipはクライアント側でコンパイルするので環境によってはコケる事があります。
    - pipと併用もできるので、condaに入っていないライブラリはpipでインストールすることができます。
- condaはバージョン管理もできます。: **pyenvの代わり**
    - 例えばanaconda3-xx.xxを入れるとpython 3.5ベースで全部入ります。
        - `conda create -n py2 python=2.7`
        - 上記コマンドを打つと、python2.7の仮想環境が構築できます。
            - `source activate py2`でpython2.7の仮想環境に入れます。
- condaは仮想環境管理にも使えます。: **virtualenv/venvの代わり**
    - 仮想環境下でcondaやpipでパッケージをインストールできます。
    - condaで作る仮想環境はpythonのバージョン違いまで吸収できるため、**virtualenvの上位互換**と言えます。
    - 事実、anacondaでvirtualenvを使おうとすると、condaで環境を作るように警告が出ます。（virtualenvが作れはします。）
- conda最高ってことです。
    - 環境構築の課題に上げた項目のうち、3つは解決します。(4番目があるので、linux/Macはpyenvを組み合わせたほうがよいです。)

#　OS毎の環境構築

## Windowsの場合
windowsにはプリインストールでpythonは入っていません。
しかしpyenvが[windowsに対応する気が一切ない](https://github.com/yyuu/pyenv/issues/62)ので、バージョン管理も考える必要があります。
でも安心してください。anacondaだけ入れれば問題無いです。

#### 環境構築方法
- [ダウンロードサイト](https://www.continuum.io/downloads#_windows)からwindows用のインストーラをダウンロードして下さい。
    - 3.5でいいと思いますが、2.7しか使わないという人は2.7用を落としてください。
    - condaで2.7環境も後から作れるのでそんなに気にしなくていいです。
- exeを実行して指示に従ってインストールしてください。（途中でpathに追加するかも聞かれます。）

非公式バイナリは依存関係を解決してくれないので、欲しいライブラリが複雑な依存関係だとうんざりします。。

## Linuxの場合
システムにプリインストールでpythonが入っています。

- 多くは2.xなので、3.xと共存したいなと思います。
- システムの方をうかつにさわるとはまります。
- 別途`apt-get install python3`などとして入れても、環境変数を自分で弄る必要があります。
- anaconda単独だと実は問題があります。
    - curlやsqlite3,opensslなどを一緒にインストールして動作をのっとります。
- 推奨はpyenvを経由することです。
    - 現在のpyenvは[anacondaに対応](http://qiita.com/yyuu@github/items/7de957838437eaecdc8a)しています。

#### 環境構築方法
1. pyenvをインストールします。

```bash
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
```

2. anacondaをインストールします。
3系でも2系でもどっちでもいいですが、3で殆どの場合不都合が無いです。
pyenvで両方共存させることも可能ですが、condaで2/3の切り替えができるので片方でいいです。

```bash
$ pyenv install -l | grep ana
# 最新版を確認。anaconda3-2.5.0 (2系はanaconda-2.5.0)
# minicondaがいい人はminicondaを入れてください。
$ pyenv install anaconda3-2.5.0
$ pyenv rehash
$ pyenv global anaconda3-2.5.0
# anacondaをメインのpythonに設定。
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
# activateがpyenvとanacondaでバッティングするので、pathに明示しておく。
$ conda update conda
#念のためconda自体をアップデートしておく。
```
(3/24修正)
`$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc`
には副作用があって、pyenv globalやpyenv localをいっさい受け付けずに、常にanacondaを使うようになります。
anaconda以外も使う人や、主に`pyenv local`で運用したい人などは、Pathに記載するのをやめてcondaのactivateをフルパスで入れる必要があります。
`source ~/.pyenv/versions/anaconda3-2.5.0/bin/activate <環境名>`
環境を頻繁に切り替えないでanacondaだけでやっていく人はpathに明示した方がよいと思います。

(4/8)
[pyenvとanacondaを共存させる時のactivate衝突問題](http://qiita.com/y__sama/items/f732bb7bec2bff355b69)について別記事を作成しました。





## Macの場合
**Mac持ってないので伝聞です。ご容赦ください。**
↓こんな話もあるのでLinuxと同様にpyenvを挟んだほうがよさそうです。
[Anacondaを入れたらHomebrewの環境が吹っ飛んだ話](http://qiita.com/spiky00/items/3f3ca3a2092e531ea1ad)

#### 環境構築方法
持っていないので、別の方の記事を参考にしてください。
pyenvがgithub経由ではなくHomebrewになるとこ以外は一緒だと思います。
[HomebrewのインストールからpyenvでPythonのAnaconda環境構築までメモ](http://qiita.com/oct_itmt/items/2d066801a7464a676994)

自分では未検証ですが、linuxの場合と同様にanacondaとpyenvのactivateがバッティングします。
anacondaへのpathを通しておいたほうが楽だと思います。

```bash
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
```

## ChromeOSの場合
MacBookAirっぽいのが3分の1くらい値段で買えます (^^

[こちら](http://qiita.com/y__sama/items/7684654a51e79566cdbc)参照
[croutonでubuntu環境を作って](http://qiita.com/y__sama/items/bb0756574456f9ab11d4)入れるのもありですが、ちょっと面倒です。

# condaの基本的な使い方

## 仮想環境編

- 仮想環境の構築

**conda create -n <環境名> python=<バージョン> <スペース区切りでライブラリ名>**

```bash
conda create -n py2 python=2.7 numpy scipy pandas jupyter
#anacondaとしてまとめて入れることも可能。
conda create -n anaconda2 python=2.7 anaconda
```

- 仮想環境の確認

```bash
conda env list
# こちらでも出る。
conda info -e
```

- 仮想環境の出入り

```bash
# 仮想環境に入る
source activate py2
# windowsではactivate py2
# 仮想環境から抜ける
source deactivate
# windowsではdeactivate
```

- 仮想環境の削除

```bash
conda remove -n py2 --all
```


## パッケージ管理編

- パッケージのインストール&アンインストール

```bash
conda install numpy scipy # pipと同じでスペース区切りで複数OK
conda install numpy=1.10.4 # バージョン指定も可能
conda install -n py2 numpy scipy # -nで環境名を指定もできる

conda update numpy # update

pip install numpy # pipも使える。condaにないときはこちらを利用
source activate py2;pip install numpy # 仮想環境に入れるときは、activateしなければいけない

conda uninstall -n py2 numpy # アンインストール

```

- パッケージの確認

```bash
conda list
# 現在入っているパッケージリスト

conda list -n py2
# -nで仮想環境下も選択可能

conda list --export > env.txt
conda create -n py2_copy --file env.txt
# エクスポートして再利用することも可能だが、
# pipで入れたパッケージはエクスポートできないのでpip freezeで別途出力しておく必要がある。
```

## anaconda cloud編

anacondaで提供されていないパッケージについても、anaconda cloud (anaconda.org) に誰かがアップしていることがあります。

```bash
anaconda search -t conda ggplot
# いろいろ出てくる
# ...
#bokeh/ggplot              |    0.6.8 | conda           | linux-64, win-32, win-64, linux-32, osx-64
#                                          : ggplot for python
#...
anaconda show bokeh/ggplot # <USER/PACKAGE>で指定すると詳細が見れる
#Using Anaconda Cloud api site https://api.anaconda.org
#Name:    ggplot
#Summary: ggplot for python
#Access:  public
#Package Types:  conda
#Versions:
#   + 0.6.5
#   + 0.6.8
conda install -c bokeh ggplot # USER名を-cで指定してパッケージをインストール
```

見づらいしOS毎の検索ができないっぽいので、https://anaconda.org/ から検索したほうが早かったりします。

# おまけ

- データサイエンスといえばRでしょ!という人もいると思います。
- condaでRもインストールできます。

```bash
conda create -n r -c r r-irkernel
```

これで今流行りのJupyterでのR利用の環境までできてしまいます。

- 普通にRを使ったり、Rstudio経由でも使えます。
- RのJupyter利用はRとrzmqのバージョンによってははまるのでこちらが楽です。

すごいね、Anaconda。

# 追記 あるいは　蛇足
決定版からは少し外れます。
(3/24追記)

## pyenv
windowsでは使えませんが、Mac/Linuxでpyenvをかませるといくつかいいことがあります。

- 環境の再構築が楽。
    - なんやかんやしてどうしようもなくなったときに、`pyenv uninstall`でなかったことにできる。
    - あるいはanacondaの新しいバージョンが出てれば、新しいanacondaをしらっと使い始められる。
- pypy,jython,stacklessなどのCpython以外が使える。
- pyenv localが使える。

### pyenv local
この中で`pyenv local`は非常に便利です。

たとえば下記を設定しておくとpy2に移動した時だけ、anaconda3ではなくanaconda2が立ち上がるようになります。

```bash
mkdir py2
cd py2
pyenv local anaconda2-2.5.0
```

実は**anacondaの仮想環境もlocalで指定することができます。**

```bash
conda create -n py2 python=2.7
pyenv local anaconda3-2.5.0/envs/py2
python
#Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec  6 2015, 18:08:32)
#[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux2
```

ただし、[linux版の環境構築](http://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%96%B9%E6%B3%95-1)に記載したとおり、`$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc`を設定していると`pyenv local`を無視してanaconda3-2.5.0を読みに行ってしまいます。

プロジェクト毎にディレクトリで環境を切って`pyenv local`で運用するか、切り替えが必要な場面で明示的に`source activate <仮想環境名>`を叩いて運用するかは、好みや利用内容によると思いますので好きな方をお選びください。

### pyenv-virtualenv

非常にややこしいことにpyenv-virtualenvというpyenvのpluginがあります。
これはpythonの仮想環境管理システムvirtualenvとは別物で、virtualenvやvenv(python3.4以降)などで作った仮想環境を切り替えることができます。
しかも、condaで作った環境まで対応しています。
そのため、pyenv localとsource activateのバッティング問題を解決してくれます。

インストールは簡単で、gitからcloneして、pyenvインストールフォルダの下のpluginフォルダに配置します。

```bash
git clone git://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
souce ~/.bashrc
```

#### pyenv-virtualenvの簡単な使い方

```bash
#環境の確認
pyenv virtualenvs
#>>>anaconda3-2.5.0 (created from /home/vagrant/.pyenv/versions/anaconda3-2.5.0)
#>>>anaconda3-2.5.0/envs/py2 (created from/home/vagrant/.pyenv/versions/anaconda32.5.0/envs/py2)

#環境のactivate
pyenv activate anaconda3-2.5.0/envs/py2
python
#>>>Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec  6 2015, 18:08:32)

#環境のdeactivate
pyenv deactivate
```

condaで環境の構築して、`pyenv activate`と`pyenv local`で環境切り替えができるようになります。
Mac/Linuxで仮想環境をよく切り替える方は、pyenv-virtualenvまで入れると生産性があがるかもしれません。