Python仮想環境の構築（pyenv + venv）

# 始めに
Python仮想環境の構築に当たっての備忘録です．

往々にして，プロジェクト毎に異なるバージョンのPythonを使わなければならない状況に遭遇します．例えば，プロジェクトAではパッケージX（Python 3.5 < ver < 3.7を要求）を使うが，プロジェクトBではパッケージY（Python 3.9 < verを要求）が必要，など．あるいは，Pythonのバージョンは同一でも良いがパッケージ毎のコンフリクトが発生することもあります．

このような状況では，各プロジェクト用の[仮想環境](https://docs.python.org/3/tutorial/venv.html)を作ることで対応することができます．

以下は，主に[こちらの記事](https://qiita.com/Shiba-You/items/93c4e043e4c8dbc60cad)を参考に，同記事に則した内容です．

追記（2023/02/01）：[こちらの記事](https://atmarkit.itmedia.co.jp/ait/articles/2301/31/news021.html)も参考になります．

# 環境
Microsoft Windows 10
MacOS，Linux，Ubuntuをご利用の場合は別記事をご覧ください．また，AnacondaやDockerも本記事の対象とはしていません．ここではpyenvとvenvを使う方法を記します．

(2022/10/21追記: MacOS，Ubuntuでの仮想環境のアクティベートに関して)

# pyenv
Pythonのバージョンを管理してくれます．複数のPythonバージョンを切り替えて使えるので，上記のような状態で重宝しますね．

### pyenv（pyenv-win）のインストール
pyenvは，WSL ([Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/about)) を除くWindows環境では動作しません．したがって，pyenv-winを利用します．[公式](https://github.com/pyenv-win/pyenv-win)からは幾つかの方法が示されていて，

* pipを使う
* zip fileを経由する
* Gitを使う
* [Chocolatey](https://community.chocolatey.org/packages/pyenv-win)を使う

が選択肢として提供されています．ここはお好みでどうぞ．

### Pythonのインストール
まず，pyenvを使ってインストール可能なPythonバージョンを確認します．
```
$ pyenv install -l
```
とすると，
```
...
3.8.0-win32
3.8.0
3.8.1rc1-win32
3.8.1rc1
3.8.1-win32
3.8.1
3.8.2-win32
3.8.2
3.9.0-win32
3.9.0
...
```
として，インストール可能なPythonが出てきます．この中から好きなPythonバージョンを選んでインストールしましょう．例えば，<code>3.8.10</code>が欲しいなら，
```
$ pyenv install 3.8.10
```
です．

### Pythonをインストールできたら
まず，Pythonのバージョンを確認しましょう．
```
$ python -V 
```
として，
```
Python 3.8.10
```
などが返されれば良し．

また，
```
$ pyenv version
```
と打てば，
```
3.8.10 ($user/.pyenv/pyenv-win/version)
```
と返されるので，ちゃんとpyenv（今回はpyenv-win）が用意してくれたPythonが使えていますね！その他諸々のコマンドは<code>pyenv</code>と打てば表示されます！

# venv
ライブラリやパッケージ，モジュールなどを管理してくれます．Python 2系ではvirtualenvという名前で，これ自体をインストールする必要があるそうですが，3系（厳密には<code>3.3</code>以降）では標準搭載されています．

### virtualenvのインストール（Python 2系 / 必要な場合）
```
$ pip install virtualenv
```
良し．

### 仮想環境の構築
プロジェクト毎に異なる仮想環境を作るのが自然な気がしますので，
```
$ cd [path_to_project_directory]
```
などとして，[project_directory]へ移動しておきましょう．さて，仮想環境の構築ですが，
```
$ python -m venv [virtual_environment_name]
```
で作成できます．

仮想環境名は，<code>.venv</code>とすることが慣例のようですが，お好みでどうぞ．僕は基本的に，その仮想環境を特徴付ける要素・名前を付け足します（<code>.venv_sklearn</code> / <code>.venv_tf</code> / <code>.venv_torch</code> / <code>.venv_playground</code>など）．

### 仮想環境のアクティベート
作ったら使う，作ったのは使うため．仮想環境をアクティベートします．
```
$ . [virtual_environment_name]/Scripts/activate
```
でアクティブ状態になります（MacOS, Ubuntuでは<code>$ . [virtual_environment_name]/bin/activate</code>）．アクティブになると，ターミナルの先頭に
```
([virtual_environment_name]) $ 
```
という表示がくっつくので，環境名が表示されている間はアクティブです．仮想環境にパッケージをインストールするには，アクティベートした状態で，
```
([virtual_environment_name]) $ pip install [package_name]
```
です．これでローカル環境の汚染を心配せずに遊べます．また，当該環境での作業が終わり，ディアクティベートする場合には，
```
([virtual_environment_name]) $ deactivate
```
のみ．シンプルですね（MacOS, Ubuntuでも同様）．

### requirements.txtの書き出し・読み込み
環境構築はとても面倒になったりします．GitHubなどを通してコードを公開するときは，ユーザが環境構築に手間取らないように環境に入っているライブラリやパッケージを全て記した<code>requirements.txt</code>を用意しておくと親切です．<code>requirements.txt</code>を作成するには，アクティブ状態で，

```
([virtual_environment_name]) $ pip freeze > requirements.txt
```

とすると，同じ階層に<code>requirements.txt</code>ができます．これを<code>git push</code>しておいてもらえると助かります．また，<code>requirements.txt</code>をインストールするには，

```
([virtual_environment_name]) $ pip install -r requirements.txt 
```

を実行すれば，<code>requirements.txt</code>に書き込まれているライブラリなどをインストールできます．環境構築が1行で終わってしまいます！嬉しいですね！

# 終わりに
手順を忘れたりしない出来の良い脳なら良いのですが，そうでもないので，個人的備忘録でした．

# 参考文献
[1] [記事1](https://qiita.com/Shiba-You/items/93c4e043e4c8dbc60cad)
[2] [記事2](https://qiita.com/t_koba/items/2e8f9eafbdd7644cff20)
[3] [記事3](https://yoheiko.com/?p=2899)