Pythonにまつわるツールのまとめ

# はじめに
Pythonをとりまくツールには`pip`や`pyenv`・`virtualenv`など数多く存在しており、その用途や使い分け方について混乱しがちです。この記事ではそれらのツールについてひとつずつ解説します。

# TL;DR
| ツール名          | 説明                                      |
|------------------|------------------------------------------|
| Anaconda         | データサイエンス向けディストリビューション      |
| conda            | Anaconda専用のパッケージマネージャー          |
| pip              | Pythonのパッケージマネージャー               |
| pipenv           | Pythonプロジェクトの管理ツール               |
| pyenv            | 複数のPythonバージョンを切り替えるツール       |
| pyenv-virtualenv | 切り分けた環境をPyenv上で選べるようにするPyenv用プラグイン |
| pyvenv           | Python標準のvirtualenvラッパー(非推奨)      |
| python -m venv   | Python標準のvirtualenvラッパー             |
| virtualenv       | プロジェクトごとにPython環境を切り分けるツール  |

だいたいの場合pyenv+pipenvでOK。

# システムデフォルトのPython環境について
## Windows
WindowsにはデフォルトのPython環境が入っていません。最近はストアからPythonをインストールできるようになったので、そちらを使うのが最も簡単です。その他の方法として、[公式サイト](https://www.python.org/)からインストーラーをダウンロードしてインストールするか、Anacondaを利用することになります。あるいは、Windows Subsystem for Linux上に構築する手段もあります。

## Linux
多くのLinuxディストリビューションには標準で何らかのPythonが利用できるようになっています。ただしディストリビューションごとに`python`コマンドで起動するバージョンが異なっています。2020年にPython2のサポート終了を迎えることから、今後は単に`python`と入力すればPython3が起動する環境が増えていくものと予想されます。

|ディストリビューション|Python3の起動コマンド|Python2の起動コマンド|
|---|---|---|
|Arch Linux|`python`|`python2`|
|Ubuntu 18.04|`python3`|`python`|
|CentOS 7|なし|`python`|

## macOS
macOS CatalinaにはデフォルトでPython2.7.16と3.7.3がインストールされています。`python`コマンドを単に入力すると2.7.16が起動します。

また、macOSにはHomebrewを使ってPythonをインストールすることができます。この場合はPython3がインストールされます。ただし、Python3の起動には`python3`コマンドが必要です。

```bash
$ brew install python
$ python --version
Python 2.7.16
$ python3 --version
Python 3.7.3
```

# ツール紹介
## pip
pipはPython標準のパッケージ管理システムです。[PyPI](https://pypi.org/)に登録されたwheel形式のパッケージを**そのpipが動いているPython環境に**インストールしてくれます。依存関係の解決なども行ってくれます。

「そのpipが動いているPython環境に」というところがハマりどころで、例えばあるプロジェクトでインストールしたパッケージAがパッケージBのバージョン1.0を要求していて、別のプロジェクトでインストールしたパッケージCがパッケージBの2.0を要求していたときに、衝突が発生することになります。こうした問題を解決するため、後ほど紹介する各種環境切り分けツールを利用します。

また、Linuxディストリビューションではnumpyなどpipでインストールできるパッケージの一部がそのディストリビューションのリポジトリに登録されていたりすることもあります。システム標準のPython環境下でPythonパッケージを導入する場合、管理者権限でpipを動かす必要がありますが、このときリポジトリから入るパッケージと衝突する可能性があるため、安易に使うべきではないでしょう。この問題はPython仮想環境の導入、あるいはホームディレクトリ以下へのパッケージの導入によって解決します。

## Anaconda & conda
Anacondaはデータサイエンス向けのパッケージを同梱したPythonディストリビューションです。PyPIとは異なる方法でパッケージ管理を行っているため、`conda`を使ってパッケージをインストールするようになっています。condaを使うと事前にビルド済みのPythonパッケージを入手することができ、特にWindows環境では手軽に豊富な種類のパッケージを利用できます。

ただしAnaconda環境下でpipを使うとcondaパッケージとの不整合が発生する可能性があるため、Anacondaを使うのであればcondaだけを利用するようにしてください。また、PyPIにあるパッケージが全てcondaにあるわけではないので、データサイエンス用途以外での出番はあまりないかもしれません。

## pyenv
複数のPythonバージョンを切り替えて使うためのツールです。特定のバージョンをデフォルトで使うようにしたり、ディレクトリごとに切り替えて使うこともできます。しかし各バージョンにつき1つの環境しか作れないため、pipを利用するときは要注意です。

以下のコマンドは、複数のディレクトリで別々のPythonバージョンを使う場合の例です。

```bash
$ mkdir test_project
$ cd test_project
$ pyenv install 3.7.0
$ pyenv local 3.7.0
$ cd ../
$ mkdir new_project
$ cd new_project
$ pyenv install 3.6.6
$ pyenv local 3.6.6
```

## virtualenv
Python仮想環境を構築するためのサードパーティー製ツールです。Google Trendsで見てみると、現時点ではこちらの方がシェアがありそうな感じです。Python仮想環境を作ってその仮想環境ごとに独立してパッケージをインストールすることができます。ただし、仮想環境内にPythonバイナリがコピーされたりするので、たくさん仮想環境を作ると無駄に容量を消費することになります。

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/53168/6ab6489e-031a-5e27-5afa-3ef08d83ed79.png)

## pyvenv & `python -m venv`
venvはPython標準の仮想環境作成ツールです。virtualenvの機能を標準に移植し、しかもバイナリをコピーするのではなくシンボリックを貼ることで軽量化を実現しています。virtualenvと同じく、それぞれの仮想環境下で独立にパッケージをインストールすることができるようになります。Python3.5までは`pyvenv`コマンドで作成していましたが、このコマンド自体が**どこのPython環境下で動いているか**を明確にするために`pyvenv`コマンドは廃止予定となり、以降は`python -m venv`コマンドを使うことが推奨されています。

`pyenv`と`pyvenv`は一文字違いのコマンドですが全く役割が違うので気をつけてください(そもそも`pyvenv`は廃止予定ですが)。

## pyenv-virtualenv
pyenvのプラグインで、pyenvでインストールしたPythonに紐付くvirtualenvで作成した仮想環境をPyenv管理下に置き、バージョン切り替えと同じ感覚で仮想環境を切り替えることができるようになるツールです。Virtualenvそのものではなく、あくまでpyenvのプラグインです。

## pipenv
Python用プロジェクト管理ツールです。Node.jsのyarnや、Rustのcargoと似たような機能を持っています。virtualenvとpipをラップしており、このコマンドひとつで仮想環境を作成するだけでなくパッケージをインストールすることも可能です。

また、`Pipfile`と`Pipfile.lock`の2つのファイルによって、再現性のあるPython環境をコードで管理できるようになりました。さらにPyenvと組み合わせると、任意のPythonバージョンを指定してプロジェクトを作成することができるようになります。

お好みで`PIPENV_VENV_IN_PROJECT`環境変数を`1`にセットしておくと良いでしょう。`.venv`ディレクトリがそのプロジェクトルートディレクトリごとに作られて、PyCharmで扱いやすくなります。

# 結局どれを使えば良いのか
個人的な感想ですが、指標を書いてみたいと思います。

## やってはいけないこと
- 特別な理由がないのに安易にAnacondaを利用すること
    - pipとの共存が難しいためです
    - たいていの場合Anacondaを利用する必要は無いはずです
- sudoでpipを利用すること
    - リポジトリ管理されているパッケージとの不整合が発生するためです

## どのPython環境を使うか
- Windowsで、データサイエンス関係のお仕事をする人はAnacondaを使うのが良いでしょう
    - ただしcondaの扱いには注意してください
- Windowsで、データサイエンスをしない人はストアor公式のPythonを使いましょう
- Linuxの人は、リポジトリにあるPython3を使いましょう
- macOSの人は、brewでPython3を入れましょう

## どのツールを使うか
- 基本的にpyenvとpipenvだけが入っていれば十分です
    - rbenvなど他の*envを使う人はanyenvを使うと便利です
- Linuxの人はシステムのPythonを使って、Homeディレクトリ以下にpipenvをインストールします
- macOSの人はbrewでpipenvをインストールします

# おわりに
Pythonにまつわるツールをたくさん紹介してきました。どれも名前が似ていたり役割が似ていたりしてややこしいですが、とりあえず必要なのは`pyenv`と`pipenv`だけですので、それだけ覚えていただければと思います。それでは快適なPython開発をお楽しみください。

# おまけ
## Linux環境におけるpipenvのインストール方法
先ほど「Homeディレクトリ以下にpipenvをインストールします」と書きましたが、その具体的な方法です。

まずはシェルの設定ファイル(`~/.bashrc`や`~/.zshrc`など)を開き、`$HOME/.local/bin`にPATHを通してください。以下はbashでの例です。

```bash:~/.bashrc
export PATH=$HOME/.local/bin:$PATH
```

```bash
$ source ~/.bashrc
```

続いてpipenvをユーザー側にインストールします。インストールが完了したら、念のため確認しておきます。バージョンが表示されれば完了です。

```bash
$ pip3 install --user pipenv
$ pipenv --version
pipenv, version 2018.7.1
```

なおArch Linuxには`python-pipenv`パッケージが用意されているので、これを利用するのが最も簡単です。