Pythonを複数バージョン管理してみる

# Pythonを複数バージョン管理してみる

Pythonを使ったプログラミングをする際、Pythonの何バージョンを使うかで揉めることがある。毎回使用するバージョンに合わせて環境を入れ替えるのが面倒なので、<fond color="OrangeRed">Python仮想環境を使用して必要がバージョンに切り替えられる快活環境を作る。</font>

![Python_VE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171097/a1f28502-424b-529f-6b14-4405c534b274.png)

## 実行環境

- OS: 
    - Ubuntu 18.04 LTS
    - Windows 10 Pro ※追加中
- Python: 3.6.9

## Python仮想環境ツール

| | |
|---|:--|
|[conda](#condaセットアップ)  | Anacondaに同封されているツール  |
|[pyenv](#pyenvセットアップ)  | オープンソースで開発しているバージョン管理ツール |

## condaセットアップ

condaはAnacondaに同封されたツールなのでAnacondaをインストールします
参考：[Anaconda Installing on Linux](https://docs.anaconda.com/anaconda/install/linux/)

### Anacondaインストーラをダウンロード

[Anaconda Individual Edition](https://www.anaconda.com/products/individual#linux)からインストーラをダウンロードする

![downlaod_link.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/171097/d37410ca-a107-b0e8-4385-a7e142d79e7d.jpeg)

### インストーラを実行する

```bash
# ダウンロードしたインストーラに実行権限を与える
$ chmod +x Anaconda3-2020.11-Linux-x86_64.sh
# インストールを実行する
$ ./Anaconda3-2020.11-Linux-x86_64.sh
```

インストーラ実行時の操作は以下

```bash
Welcome to Anaconda3 2020.11

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>> Enterを入力
.
.
Do you accept the license terms? [yes|no]
[no] >>> 
Please answer 'yes' or 'no':
>>> yes
.
.
Anaconda3 will now be installed into this location:
/home/$USER/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/$USER/anaconda3] >>> Enterを入力
.
.
Do you wish the installer to initialize Anaconda3
by running conda init? [yes|no]
[no] >>> yes
```

### condaチートシート

```bash
# 名前とPythonバージョンを指定して仮想環境を作る
# ex) conda create --name py36 python=3.6
$ conda create --name <name> python=<verson>

# 準備されている仮想環境リストを表示する
$ conda info --envs
# conda environments:
#
base                  *  /home/dai_guard/anaconda3
py36                     /home/dai_guard/anaconda3/envs/py36

# 仮想環境を有効にする ※デフォルトのbase環境になる
$ conda activate

# 名前を指定して仮想環境を有効にする
$ conda activate <name>

# 仮想環境を無効にする
$ conda diactivate

```
---

## pyenvセットアップ

### Ubuntu 18.04 LTSの場合

GitHubで公開されているオープンソースなツール

#### `pyenv`をクローン&ビルドする

```bash
# リポジトリからクローンする
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# ビルドする
$ cd ~/.pyenv
$ src/configure
$ make -C src
```

#### 環境変数を設定する

```
# pyenvのフォルダを設定する
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
# PATHにpyenvフォルダを追加する
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
# 自動でpyenvの仮想環境を起動する設定
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
```

---

### Windows 10 Proの場合

参考ページ
[Windows 10 で Python のインストールから Poetry と pyenv の利用](https://qiita.com/kerobot/items/3f4064d5174676080585)

#### `pip`から`pyenv`をインストール

```powershell
> pip install pyenv-win --target\.pyenv
```

#### 環境変数を設定する

`Powershell`を起動して以下のコマンドを実行することで、ユーザーの環境変数を設定する

```powershell
> [System.Environment]::SetEnvironmentVariable('PYENV',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")
```

次に管理者権限で`Powershell`を起動して、以下のコマンドを実行することで環境変数の設定は終了

```powershell
> [System.Environment]::SetEnvironmentVariable('PATH', $HOME + "\.pyenv\pyenv-win\bin;" + $HOME + "\.pyenv\pyenv-win\shims;" + $env:Path,"Machine")
```

`Powershell`再起動後、`pyenv`コマンドが実行できるようになる

#### ※注意
`pyenv`インストール後、`pyenv`で管理するバージョンの`Python`に切り替り変わらないことがある。
その場合は`pyenv rehash`コマンドを実行することで有効になります

---

#### `pyenv`チートシート

```bash
# 現在インストールされているPythonバージョン
$ pyenv versions
* system (set by PYENV_VERSION environment variable)
  3.8.7
# イントールできるPythonバージョン
$ pyenv install --list
# バージョンを指定してPythonをインストールする
# ex) pyenv install 3.8.7
$ pyenv install <version>
# Pythonバージョンを切り替える
# ex) pyenv shell 3.8.7
$ pyenv shell <version>
```

## 使ってみて

### `conda`

- メリット
  - インストールが簡単
  - Anacondaでメンテナンスしてるので信頼できる
  
- デメリット
  - Anacondaに同封なのでライセンス対応のため会社などでは使えない可能性がある
  - 力補完が効かないのでコマンドを覚えないといけない

### `pyenv`

- メリット
  - 入力補完が使えるので簡単
  - venvと連動してフォルダごとに個別の環境を作れる

- デメリット
  - デフォルトだと現在使用中の仮想環境が表示されない