Python 3.6 時代(2018年2月時点)の環境構築方法を使い分ける指針 (venv, virtualenv, Anaconda)

Python の環境構築方法は venv, virtualenv, Anaconda などいろいろあると思いますが、どのように使い分けるか。Python 3.6 時代(2018年2月時点)における私なりの考えをまとめてみました。macOS 環境を想定しています。

# 使い分ける指針

### 基本原則

##### バージョン

原則、Python 3 を使うようにします。
Python 2 はサポートされるのが 2020 年まで。Python3 だとどうしても対応できない時だけ使い、極力使わないようにします。

##### システムにデフォルトでインストールされている Python

パッケージ追加などの変更作業はしないようにし、極力汚さないようにします。理由は、システムが使用している Python に悪影響を与えることを避けるためです。仮想環境を作成し、仮想環境内でパッケージの管理を行います。

### 各環境構築方法の使い分け

前提として、OS の Python をインストール状況は次の通りとします。

* Python 2.7.x がプレインストールされているものとします。
* OS のパッケージマネージャで Python 3.6.x を入れておきます。

```shell-session
// macOS の場合。新規インストール
$ brew install python3
// 最新版にアップグレード
$ brew upgrade python3
```

venv, virtualenv, Anaconda の使い分けは次の通りにしています。

* Python 3.6.x を使う場合は、Python 3.6.x の venv を使って仮想環境を作成します。
* Python 2.7.x を使う場合は、virtualenv を使って仮想環境を作成します。
* Anaconda は Docker 化します。Python 2.7.x, 3.6.x 以外を使いたい場合は、それ用の Anaconda コンテナイメージを作成します。

では、どうして上記の使い分けにしているのか？
各環境構築方法の特徴を見ながら説明していきます。

### Python3.6 の venv

環境構築方法の中でこれを優先して使うのは、Python の世界での標準的な方法になるべく従うため。[Pythonチュートリアル](https://docs.python.org/ja/3.6/tutorial/venv.html)でも venvが紹介されています。以下、venv の位置づけを示すために公式マニュアルから引用します。

[Python標準ライブラリ](https://docs.python.org/ja/3.6/library/venv.html#module-venv)
> Python 3.3 と 3.4 では、仮想環境の作成に推奨していたツールは pyvenv でしたが、Python 3.6では非推奨です。
> バージョン 3.5 で変更: 仮想環境の作成には、 venv の使用をお勧めします。


[What’s New In Python 3.3](https://docs.python.jp/3.3/whatsnew/3.3.html)
> PEP 405: Virtual Environments
> 仮想環境(Virtual environment)は隔離されたPython環境を作成する手助けをします。...(略)... このコンセプトと実装は、人気のサードパーティパッケージである virtualenv を元にしていますが、インタプリタコアとの統合による恩恵を受けています。この PEP はプログラムからのアクセス用の venv モジュールと、コマンドラインからのアクセスと管理向けの pyvenv スクリプトを追加します。


##### 出来ること

* 仮想環境ごとに pip パッケージの管理を切り出せる

##### 出来ないこと

* Python 自体のバージョン切り替え

##### 使い方

```
// 環境名
$ python3 -m venv 仮想環境名

// 環境の有効化
$ source 仮想環境名/bin/activate
(仮想環境名) $ python --version
Python 3.6.4

// 環境の無効化
(仮想環境名) $ deactivate
```

### virtualenv

venv だと、Python 2.7.x を使えないので、その対応のために virtualenv を使います。

##### virtualenv が出来ること

* Python のバージョンを指定できる（既にインストールされているもののみ）
* 仮想環境ごとに pip パッケージの管理を切り出せる

##### 使い方

```shell-session
// virtualenv をインストールする。
// OS の pip3 でインストールするのは virtualenv だけにする。
$ pip3 install virtualenv

// Python バージョンを指定して仮想環境を作る場合は --python で指定する。 
// 最後の python2.7.14 は仮想環境名。任意の名前で良い。
$ virtualenv --python=/usr/local/bin/python2.7 python2.7.14
```

### Anaconda

便利なソフトなのですが、独自のディストリビューションなのと、一部システムコマンドのパスを覆い隠すデメリットがあるので、Docker で対応しています。


##### メリット

* データサイエンス系のパッケージや JupyterLab など便利なツール群が初めから入っている。
* conda コマンドで仮想環境を柔軟に作成できる。Python バージョンの指定も可能。

##### デメリット

* Python だけでなく、Anaconda が内蔵している多数のコマンドへのパスが通ってしまう。

##### インストール方法

Docker 環境で使う場合は、「[Anaconda の JupyterLab を Docker で使う](https://qiita.com/ao_log/items/350a3845d49f4b1d7198)」で記事にしてみました。
Docker を使わない場合は、[公式ドキュメント](https://docs.anaconda.com/anaconda/)をご参照ください。インストーラをダウンロードし、インストーラの指示に従うだけで入るはずです。


# 私見

もっといい使い分け方もあるかもしれません。そして、それは時代とともに変わっていくものだとも思います。ただ、基本的な考え方として、次の 2 点を守るのが肝要だと考えています。（勉強不足で標準の方法に従えていないこともよくあるのですが・・・）

* なるべく標準の方法に従う
* OS を汚すのは必要最小限にする


# 参考

[Python標準ライブラリ: venv](https://docs.python.org/ja/3.6/library/venv.html#module-venv)
[Pythonチュートリアル: 12. 仮想環境とパッケージ](https://docs.python.org/ja/3.6/tutorial/venv.html)
[PEP 405 -- Python Virtual Environments](https://www.python.org/dev/peps/pep-0405/)
[Anaconda: Installation](https://docs.anaconda.com/anaconda/install/)
[Pythonの環境構築を自分なりに整理してみる](https://medium.com/@chezou/python%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%82%92%E8%87%AA%E5%88%86%E3%81%AA%E3%82%8A%E3%81%AB%E6%95%B4%E7%90%86%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B-dc8d8f2fe989)
[pyenvが必要かどうかフローチャート](https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7)