Python仮想環境リサーチノート：Anacondaをなんとなく敬遠している方々へ

#はじめに
　Python環境をAnacondaを用いて構築した人は多いのではないだろうか。しかし、[pipと併用することについてのこの有名なトラブル](http://onoz000.hatenablog.com/entry/2018/02/11/142347)が念頭にあって、パッケージマネージャ・仮想環境マネージャとしてのAnacondaをどう利用すればいいかいまいちよくわからず、まぁpipでいいか、と敬遠している人が多いと思う。私もその一人だった。
　しかし、Anacondaは実は非常に優秀な仮想環境マネージャである、と主張する記事もいくつか見かけてきた。それではpipとの競合を回避しつつ、Anacondaを使うことはできないのだろうか。実際Anacondaは仮想環境マネージャとしてどれほど優秀なのだろうか。この問に答えるため、随分とGoogle検索を渡り歩いたので、その結果を共有する。ぜひ参考にしてみてほしい。
　
　そういうわけで、筆者自身が様々なウェブサイトを渡り歩いて学んだことをまとめてみた。なお、実際に手を動かしたわけではない。その点はご勘弁いただきたい。

### 話の流れ
1. 他の仮想環境マネージャ群を知る
2. Anacondaの利点を知る
3. pipとの競合を解決する
4. おまけ

#Anaconda以外の仮想環境マネージャ群について
　この話題については、[この記事](https://qiita.com/ganariya/items/1bf870275bad7b5ab506)と[この記事](https://qiita.com/sk217/items/43c994640f4843a18dbe)を読んでほしい。抜粋しようとすると多すぎて引用の範囲を超えるし、そのうえ大変わかりやすくまとまっているので仮想環境を知っておきたい人は読んで絶対に損はない。以下はこれらを読み切った前提で話をすすめる。
#Anaconda「ディストリビューション」とは
参考：https://qiita.com/t2y/items/dd6d7f9c70ac2b8a79da

　詳しくは参考記事を読んでいただきたいが、要約すると、Anacondaそのものはパッケージマネージャでも仮想環境マネージャでもなく、Pythonインストーラ・パッケージマネージャ・仮想環境マネージャ等を統合した「ディストリビューション」であって、ルート環境から切り離した形でアプリケーション開発を行うためのツール群である、という趣旨。
#Anacondaの優秀性
引用元：https://qiita.com/y__sama/items/5b62d31cb7e6ed50f02c#conda%E3%81%A8%E3%81%AF

> ##condaとは?
<ul><li>condaというパッケージ管理システムが使えます。: <strong>pipの代わり</strong>
<ul>
<li>対応パッケージは現時点で400オーバーです。</li>
<li>pipはクライアント側でコンパイルするので環境によってはコケる事があります。</li>
<li>pipと併用もできるので、condaに入っていないライブラリはpipでインストールすることができます。</li></ul></li>
<li>condaはバージョン管理もできます。: <strong>pyenvの代わり</strong>
<ul>
<li>例えばanaconda3-xx.xxを入れるとpython 3.5ベースで全部入ります。
<ul>
<li><code>conda create -n py2 python=2.7</code></li>
<li>上記コマンドを打つと、python2.7の仮想環境が構築できます。
<ul>
<li>
<code>source activate py2</code>でpython2.7の仮想環境に入れます。</li></ul></li></ul></li></ul></li>
<li>condaは仮想環境管理にも使えます。: <strong>virtualenv/venvの代わり</strong>
<ul>
<li>仮想環境下でcondaやpipでパッケージをインストールできます。</li>
<li>condaで作る仮想環境はpythonのバージョン違いまで吸収できるため、<strong>virtualenvの上位互換</strong>と言えます。</li>
<li>事実、anacondaでvirtualenvを使おうとすると、condaで環境を作るように警告が出ます。（virtualenvが作れはします。）</li></ul></li>
<li>conda最高ってことです。
<ul>
<li>環境構築の課題に上げた項目のうち、3つは解決します。(4番目があるので、linux/Macはpyenvを組み合わせたほうがよいです。)</li></ul></li></ul>

　Anaconda以外の仮想環境を理解した今でこそ、これらの主張内容がよくわかると思う。condaが最高かどうかはともかく、condaを仮想環境マネージャとして使う分には旨味が多そうだ。
　ただ、引用中にある`source activate`は今は非推奨で、代わりに`conda activate`を用いるべきだとされている。condaはパッケージマネージャとしてはやや物足りないところがあるのも指摘しておきたい。

#ベストプラクティス？
　以上で、仮想環境マネージャ群を概観しつつ、Anacondaの魅力を整理した。そこで、Anacondaを採用する前に、pipとの競合について調べ、Anacondaの最もよい使い方を探る。

##なぜpipと競合するのか
引用元：https://ja.wikipedia.org/wiki/Anaconda_(Python%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)#%E6%A6%82%E8%A6%81
> pipはパッケージをインストールするときに、以前にインストールされたパッケージと競合するかどうかを確認せずに、依存するPythonパッケージを自動的にインストールする。 既存のインストールの状態に関係なく、パッケージとその依存関係をインストールする。 このため、たとえばGoogle Tensorflowのインストールが正常に機能しているユーザーが、pipを使用して、Tensorflowが使用するものとは異なるバージョンに依存するnumpyライブラリを必要とする別のパッケージをインストールすると、機能しなくなることがある。 場合によっては、パッケージは動作しているように見えても、詳細に異なる結果が生成されることがある。

　これは単にpipのシステムを説明しているだけだが、おおよそこのあたりの動作がcondaとの競合に関わっているのだろう。すなわち、pipでは依存環境ごとのバージョンの違いをうまく吸収できない場合があり、conda環境と併用されたときにそれが深刻化する、という理解でよいだろう。
　ちなみに、[公式のヒント](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html?highlight=pip#using-pip-in-an-environment)にも"Use pip only after conda"と書かれている。

##pipとの競合を回避するために
<dl>
<dt>
<a href=https://qiita.com/ftnext/items/041cf583ba102f69ee45#conda%E3%81%A8pip%E3%81%AF%E6%B7%B7%E3%81%9C%E3%82%89%E3%82%8C%E3%82%8B>
Anacondaと付き合うための情報を整理する（Pythonのインストール方法とパッケージ管理方法を中心に）
</a>
</dt>
<dd>
 アップデートによってcondaとpipがある程度共存可能になったことが実験とともに示されている。また、公式のサイトに実験的な機能が載っていることも紹介されている。
</dd>
</dl>

また、[公式のヒント](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html?highlight=pip#using-pip-in-an-environment)によると、

1. pipはconda installが全部済んでから使え
2. 環境の分離のためにconda仮想環境を使え
3. 変更が必要になったら仮想環境を再構築せよ
4. Condaとpipのrequirements.txtを保存しておけ

とある。
##結論
　上記を踏まえれば、ひとまず**プロジェクトごとにcondaで仮想環境を作成しつつ、その仮想環境内でpipを使っている分にはあまり困りはしないだろう**というのが自分の当面の結論だ。

##poetry
　Anaconda利用法のベストプラクティスからはややはずれるが、Anacondaをチーム開発に持ち込もうとすると、環境の整合をとるのはrequirements.txtを介してということになる。しかしこれは前時代的な環境の共有方法だ。非Anacondaの仮想環境マネージャ群が依存パッケージのインデックスファイルを進化させてきているので、状況に応じてそれらとAnacondaとの併用、あるいはAnaconda断念を考えたほうがいいだろう。目下のところ、poetryはインデックスファイルを拡張するという点で優秀なように見受けられ、正式版もリリースされたようなので、参考に挙げておく。

#むすび
 以上で仮想環境リサーチを終わる。実際に手を動かしていない以上、自分の結論はすぐにまた変わるかもしれないが、そのときは新しく記事を書くなり訂正を入れるなりするつもりだ。Pythonは言語仕様がかんたんでよくまとまっているのに、仮想環境構築は初心者泣かせな印象があった。こうした記事の存在がPython入門者やその他の仮想環境に困る人の役に立てば幸いである。