Pyenv による Python 環境構築ガイド

# 1. 環境
Ubuntu 22.04

# 2. 必要なパッケージのインストール

Ubuntu 22.04 に pyenv をインストールする前に、必要なパッケージをインストールします。
必要なパッケージに関してはpyenvのwikiに載っています。
https://github.com/pyenv/pyenv/wiki#suggested-build-environment

```
sudo apt update; sudo apt install build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl git \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
```

# 3. pyenv のインストール
今パソコンに入っているPythonのバージョンがなんであれ、直接GitHubからpyenvを取ってきます。
ホームディレクトリ直下の.pyenvの中にインストールします。

```
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
以下のpyenvのREADMEの通り、セットアップしていきます。

https://github.com/pyenv/pyenv?tab=readme-ov-file#linuxunix

```
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc 
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc 
echo 'eval "$(pyenv init - bash)"' >> ~/.bashrc
```

ちなみに3つ目で`~/.bashrc`に`eval "$(pyenv init - bash)"`を追加していますが、これはまず`pyenv init - bash`が実行され、

```
PATH="$(bash --norc -ec 'IFS=:; paths=($PATH);
for i in ${!paths[@]}; do
if [[ ${paths[i]} == "''/home/hoge/.pyenv/shims''" ]]; then unset '\''paths[i]'\'';
fi; done;
echo "${paths[*]}"')"
export PATH="/home/hoge/.pyenv/shims:${PATH}"
export PYENV_SHELL=bash
source '/home/hoge/.pyenv/completions/pyenv.bash'
command pyenv rehash 2>/dev/null
pyenv() {
  local command=${1:-}
  [ "$#" -gt 0 ] && shift
  case "$command" in
  activate|deactivate|rehash|shell)
    eval "$(pyenv "sh-$command" "$@")"
    ;;
  *)
    command pyenv "$command" "$@"
    ;;
  esac
}
```

上記のような出力が得られるのですが、これらを動的に実行するためにevalが用いられます。

次に以下も実行しておきます。これもpyenvのREADMEに載っている手順です。

```.profileを使う場合
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile 
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile 
echo 'eval "$(pyenv init - bash)"' >> ~/.profile
```

```.bash_profileを使う場合
cho 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile 
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile 
echo 'eval "$(pyenv init - bash)"' >> ~/.bash_profile
```

.profileや.bash_profileは、システムログイン時に実行されるログインシェルが実行する設定ファイルなので、例えばデスクトップからターミナルを開いて使う場合は.bashrcしか実行されず、.profileや.bash_profileへのコマンドの追加は不要です。
ただし、以下のコマンドでpyenvが実行できるかは確認しておきましょう。

```
pyenv --version
```

また、もしPythonのバージョンを切り替えるだけならpyenvだけで十分です。以下のgifで使い方を参照してください。

![install_local_python.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554170/7a6fa531-1fad-4d65-bf02-188dbb5b60df.gif)

# 4. pyenv-virtualenvのインストール

pyenvだけだと様々なPythonのバージョンを切り替えることはできますが、同じバージョンのPythonを複数の仮想環境で実行することができません。そこでpyenv-virtualenvをインストールします。

https://github.com/pyenv/pyenv-virtualenv

こちらもpyenv-virtualenvのREADMEにセットアップ方法が記載されていますが、以下でも説明します。

```
git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv 
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc 
exec "$SHELL"
```

最後にインストールが成功したか確認してください。

```
pyenv virtualenvs
```

# 5. Python のバージョンと仮想環境のセットアップ

## (1) Python のインストール

pyenv を使って Python をインストールします。

```所望のバージョンを指定します
pyenv install 3.10.12
pyenv install 3.9.18
```

> どのバージョンがインストール可能かは、次のコマンドで確認してください。`pyenv install -l`
たくさんバージョンが出てくるので、欲しいメジャーバージョンが決まっているなら`pyenv install -l | grep " 3.6."`のようにすれば絞りやすい。

## (2) 仮想環境の作成

Python 3.10.12 を使用して`chicken_nugget`という仮想環境を作成します。

```
pyenv virtualenv 3.10.12 chicken_nugget
```

作成した仮想環境の確認：

```
pyenv virtualenvs
```

## (3) 仮想環境の有効化

仮想環境を有効化するには、以下を実行します。

```
pyenv activate chicken_nugget
```

特定のプロジェクトフォルダで仮想環境を自動適用するには、次のようにします。

```
pyenv local chicken_nugget
```

どちらも特定の仮想環境を有効化するコマンドですが、前者は**現在のシェルセッション**でのみ有効化するコマンドなので、ターミナルを閉じたりすると仮想環境はそこで終了するのに対して、後者はカレントディレクトリに仮想環境をセットするので、そのディレクトリに戻ってくれば自動で仮想環境が有効化されます。コマンド実行後ディレクトリ内に`.python-version`というファイルが生成され、中身を見ると

```
chicken_nugget
```
のようにシンプルに仮想環境の名前が書いてあると思います。pyenvはこの情報をもとに指定した仮想環境を有効化します。

# 6. その他

## 仮想環境を消したい

```
pyenv uninstall chicken_nugget
```

## pyenv localを解除したい

```
pyenv local --unset
```