【pyenv】WSL2上にpyenvをインストールする

# 内容
- pyenvとは？
- WSL2のインストール
- pyenvのインストール
- 基本的な使い方

# pyenvとは？
pyenv は、Python のバージョン管理ツールの一つで、複数の Python バージョンを簡単に切り替えて使うことができるツールです。プロジェクトごとにPython のバージョンを切り替えたい場合やライブラリの要件に対応したりする際に便利です。

# まずはWSL2のインストール
① Windows PowerShellを管理者権限で開いて以下を実行。
```powershell:PowerShell
wsl --install
```
インストールが終わったらPCを再起動します。

② 再起動したら、ユーザ名とパスワードの入力を求められるので自分の好きなように設定します。(パスワードは忘れないように)

③ 次のコマンドを実行し、インストールされている Linux ディストリビューション一覧が確認できたらOKです！
```powershell:PowerShell
wsl -l -v
```
![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677675/84b4240f-82d0-8414-02b6-7ed5a0ffe01a.png)


④ 既定のバージョンを WSL 1 または WSL 2 に設定する際には、以下を実行します。今回は実行する必要はないです。
```powershell:PowerShell
wsl --set-default-version [Version]
```
[Version] の部分は、1 または 2 に置き換える。

⑤ もし今後、別の新しい Linux ディストリビューションをインストールしたときに、使用するディストリビューションを変更したければ以下を実行します。これも今回は実行してないです。
```powershell:PowerShell
wsl --set-default [DistributionName]
```
[DistributionName]は使用したいディストリビューション名に書き換える。
[Microsoftの公式](https://learn.microsoft.com/ja-jp/windows/wsl/install)を参考にして行いました。

# pyenvのインストール
 pyenvのインストールを行っていきます。[公式ドキュメント](https://github.com/pyenv/pyenv)の「Installation/Set up your shell environment for Pyenv/for Bash」を参考に行っていきたいと思います。手順は以下の通りです。
 
 ① Gitコマンドでホームディレクトリに.pyenvを作成しインストール
 ```Bash:WSL2
 git clone https://github.com/pyenv/pyenv.git ~/.pyenv
 ```

 ② 環境変数の設定１
 以下のコマンドを一行ずつ実行していきましょう。それぞれの意味については最後に解説します。
 ```:WSL2
 echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
```

③ 環境変数の設定２
同じく一行ずつ実行します。
```:WSL2
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
echo 'eval "$(pyenv init -)"' >> ~/.profile
```

④ Shellの再起動
変更を反映させるためにShellを再起動します。
```:WSL2
exec "$SHELL"
```

⑤ Pythonのビルドのための依存関係をインストール
ここでいう依存関係とは、Pythonをビルドするために必要なライブラリやコンパイラのことです。以下を一行ずつ実行しましょう。
```:WSL2
sudo apt update
sudo apt install -y build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
```
これでインストールは完了です!

# 基本的な使い方
1. **好みのバージョンをインストールする**
    - `pyenv install --list`を実行することで現在インストール可能なPythonのリストを表示できます。
    - `pyenv install [version name]`のようにバージョンを指定することで好きなバージョンがインストールされます。
    - `pyenv versions`で現在インストール済みのバージョンを確認できます。また、使用中のバージョンにはアスタリスクがついて示してくれます。
2. **使用するバージョンの切り替え**
    - `pyenv global [version name]`で現在のユーザに適応されるバージョンを指定できます。
    - `pyenv local [version name]`で現在いるディレクトリで適応されるバージョンを指定できます。

## 環境変数について
　インストールの際に環境変数の設定として、合計6つのコマンドを実行しましたが、それぞれの意味をまとめておきます。より詳しく知りたい方は[公式ドキュメント](https://github.com/pyenv/pyenv)の「Environmental Variables」を確認してください。
 
1. `echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc`
    - これは、~/.bashrcファイルに`export PYENV_ROOT="$HOME/.pyenv"`という行を追加することを意味します。~/.bashrcファイルは、Bashシェルが起動する際に自動的に読み込まれる設定ファイルであり、このファイルに環境変数を記述することで、シェルの動作をカスタマイズすることができます。
    - `export`は、環境変数を設定するためのコマンドで、変数を環境変数として扱うことを示します。
    - ここでは、Bashシェルが起動する際にPYENV_ROOTという環境変数が設定され、その値として "$HOME/.pyenv"が使われるようになります。これにより、pyenvはどこにデータを格納するべきか知ることができます。
1. `echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc`
    - これは、~/.bashrcファイルに`command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"`という行を追加することを意味します。これはpyenvを使用するために必要な環境変数PATHを設定するためのコマンドです。
    - `command -v pyenv >/dev/null`の部分は、pyenvコマンドが存在するかどうかを確認するためのコマンドです。`command -v`は指定したコマンドが存在する場合にそのパスを出力し、存在しない場合は何も出力しないコマンドです。`>/dev/null`は標準出力を捨てるための記述で、結果を表示しないようにします。
     - `||`の部分は、直前のコマンドが失敗した場合に実行されるコマンドを指定します。つまり、pyenvコマンドが存在しない場合に後ろのコマンドが実行されます。
    - `export PATH="$PYENV_ROOT/bin:$PATH"`の部分は、PYENV_ROOT環境変数の値である pyenvのインストールディレクトリのbinディレクトリを、現在のPATH環境変数の先頭に追加します。これにより、pyenvのコマンドが他のコマンドよりも優先して実行されるようになります。
1. `echo 'eval "$(pyenv init -)"' >> ~/.bashrc`
    - このコマンドは、~/.bashrcファイルに`eval "$(pyenv init -)"`という行を追加することを意味します。これはpyenvを初期化し、現在のシェルにpyenvを使えるようにするための設定です。
    - `eval`は、引数として与えられた文字列を評価して実行するコマンドです。
    - `pyenv init -`の部分は、pyenvコマンドを初期化するためのコマンドで、現在のシェルにpyenvを使えるように設定します。-オプションは、初期化時にシェルの種類を自動的に検出し、適切な初期化コマンドを生成するために使用されます。

　上の3つのコマンドは~/.bashrcに対して行った操作だったのに対して、残りの3つは同様の操作を~/.profileに対して行います。~/.profileは、ユーザーがログインする際に読み込まれる設定ファイルであり、シェルの起動時に実行されるコマンドを記述するためのものです。
1. `echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile`
1. `echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile`
1. `echo 'eval "$(pyenv init -)"' >> ~/.profile`