python, pipenv, pyenv, virtualenv, pip, conda


現在 [pipenv](https://github.com/pypa/pipenv) だけを使っています。https://qiita.com/propella/items/ea29d6a62fdf75f1b421 参照。

以下に古い情報も何かのために残しておく。

---

いろいろ失敗した結論としては pyenv を使って virtualenv を使わないのが安全という事で落ち着いている。仕事で Jupiter notebook を使うようになったので突然こういうのを使う必要が出て調べている。感触としては、バグか仕様か分からない挙動がいっぱいなのでこの組み合わせは不味いのではと思っているが一応メモする。

* pyenv とは Python のバージョンをディレクトリごとにを切り替えるツール。
  * 例えば TypeScript を npm でローカルインストールした時のように、あるプロジェクトで使う Python のバージョンを固定出来る。
* pyenv-virtualenv とは、Python の環境 (pip や conda でライブラリをインストールする場所) を切り替えるツール。
  * 例えば npm でライブラリをローカルインストールした時のように、あるプロジェクトで使う Python ライブラリのバージョンを固定出来る。
* pip とは、Python のライブラリを管理出来るツール。npm でグローバルにインストールする時のような動作。
* conda とは、環境を切り替えたりライブラリを管理するツール。
  * pyenv-virtualenv + pip と機能が被っているが Anaconda という人気ディストリビューションで使われている。

## [pyenv](https://github.com/pyenv/pyenv)

Mac の場合インストール方法は https://github.com/pyenv/pyenv#homebrew-on-mac-os-x に記載がある。Ubutu の場合 https://github.com/pyenv/pyenv-installer

```
brew update
brew install pyenv
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc
exec "$SHELL"
```

コマンド例:

* pyenv install --list
  * インストール出来るバージョンのリスト
* pyenv install (バージョン)
  * とあるバージョンをインストール
* pyenv rehash
  * インストールした後で実行する。
* pyenv version
  * 現在有効なバージョン
* pyenv versions
  * インストール済バージョン
* pyenv local バージョン名
  * 現在のディレクトリの有効なバージョンを決める。
* pyenv global バージョン名
  * グローバルに有効なバージョン名をきめる。
* pyenv shell バージョン名
  * .python-version ではなく、シェルの環境変数で指定されたバージョンを有効にする。
* pyenv uninstall (バージョン)
  * とあるバージョンをアンインストール

pyenv で有効なバージョンを特定するには、pyenv local でディレクトリごとに指定する。例えば、以下のように test ディレクトリにいる時だけ anaconda3-5.1.0 で外に出ると Python 2.7.10 になるというような事が出来る。pyenv local で設定した内容は .python-version に記録される。

```sh
$ cd test
$ pyenv local anaconda3-5.1.0
$ python --version
Python 3.6.4 :: Anaconda, Inc.
$ cd ..
$ python --version
Python 2.7.10
```

## [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv)

Mac の場合インストール方法は <https://github.com/pyenv/pyenv-virtualenv#installing-with-homebrew-for-os-x-users> に記載がある。

* `brew install pyenv-virtualenv`
* `eval "$(pyenv virtualenv-init -)"` を .zshrc に追加
* `exec "$SHELL"`

使い方

```sh
(バージョン 2.7.14 を使った 新しい環境 my-env を作る。)
$ pyenv virtualenv 2.7.14 my-env

(環境のリストを表示)
$ pyenv virtualenvs 
  2.7.14/envs/my-env (created from /Users/tyamamiya/.pyenv/versions/2.7.14)
  my-env (created from /Users/tyamamiya/.pyenv/versions/2.7.14)

(pyenv versions でも確認出来る)
$ pyenv versions # 
* system (set by /Users/tyamamiya/.pyenv/version)
  2.7.14
  2.7.14/envs/my-env
  my-env

(my-env を有効にする)
$ pyenv activate my-env
$ python --version
Python 2.7.14

(my-env を無効にする)
$ pyenv deactivate
$ python --version
Python 2.7.10

(現在のディレクトリで my-env を使う)
$ pyenv local my-env
```

バージョンが Anaconda の時は virtualenvs に現れない。(https://github.com/pyenv/pyenv-virtualenv/issues/178)

## [pip](https://www.python.jp/install/ubuntu/pip.html)

Pip とは、Python 標準のパッケージユーティリティらしい。グローバルしかない npm みたいな物か。

## [conda](https://conda.io/docs/)

言語を問わないパッケージ管理システムらしい。Anaconda に入っている。

使い方

```
(my-conda-env という名前の環境を作る)
$ conda create --name my-conda-env

(作った環境を確認)
$ conda env list
# conda environments:
#
base                  *  /Users/tyamamiya/.pyenv/versions/anaconda3-5.1.0
my-conda-env             /Users/tyamamiya/.pyenv/versions/anaconda3-5.1.0/envs/my-conda-env

https://github.com/pyenv/pyenv-virtualenv#anaconda-and-miniconda によると、pyenv activate で conda 環境を有効にするらしいが、version `my-conda-env' is not a virtualenv と出て失敗した。しかも pyenv が conda の activate を隠してしまうのでフルパスで指定しなくてはいけない。

(環境を有効にする)
$ source $PYENV_VIRTUAL_ENV/bin/activate my-conda-env 

(環境を無効にする)
$ source $PYENV_VIRTUAL_ENV/bin/deactivate

(環境を削除するはずだが、削除出来なかった。。。代わりに pyenv uninstall で削除出来た。)
$ conda remove --all my-conda-env
```

`pyenv virtualenv anaconda-xxx` を実行すると内部的に `conda create` が呼ばれている雰囲気だったが、同じ物なのかどうかよくわからなかった。

conda で作った環境は pyenv versions にも現れるが、activate した時と動作異なり `pyenv local` で有効にすると conda コマンドが使えなくなった。

`conda install` でもパッケージのインストールが出来るらしいが `pip install` と混ぜては行けないらしい。

参考

* [Anaconda は Environment Isolation Tool (環境分離ツール) ではない](https://qiita.com/t2y/items/dd6d7f9c70ac2b8a79da)
* [condaとpip：混ぜるな危険](http://onoz000.hatenablog.com/entry/2018/02/11/142347)
* [MacへのJupyter Notebookのインストール](https://qiita.com/Haji-Fuji/items/9e3d6ca46eb02f3c241f)