Anaconda から pyenv + venv に乗り換えてみた



# 概要
`Python`には多くのバージョン管理ツール，パッケージ管理ツールがあります．今回はバージョン管理に`pyenv`，パッケージ管理に`venv`を使った方法をまとめます．
`venv`の紹介記事では，多くの場合，ディレクトリごとに仮想環境を作っています．環境の複製は`requirements.txt`を使って簡単にできますが，同じような環境が複数のディレクトリにまたがって存在してしまう可能性があります．
今回は仮想環境を`~/venvs/`にまとめて置くことで効率的な仮想環境の管理を目的とします．

（この「`root`直下に仮想環境をまとめて管理する」記事を当初探していたのですがどうも見つからなかったので，もしかしたら致命的なNG行動なのかもしれません．もしそうでしたら教えて下さい．）

# はじめに
はじめまして．初投稿の記事なので拙い部分は多分にあると思いますが，色々とご教授いただけると幸いです．
<details><summary>背景</summary>

さて，私が`Python`をはじめて触ったのが2022年でした．当時先輩から「`Anaconda`で環境作ったら良いよ」と言われたので`Anaconda`を入れて使っていました．当時は特に考えずに必要なパッケージがあれば手当たり次第にインストールしたため，環境は膨れ上がり，依存関係もごちゃごちゃになってしまいました．致命傷となったのは`Anaconda-Navigator`が起動しなくなったことです．おそらく`conda`コマンドと`pip`コマンドを混合して使っていたためにおきました．これから`Anaconda`で環境を作る方は`conda`コマンドのみで管理するようにしましょう．
参考：https://qiita.com/dem_kk/items/74a3b14f949485ad56cb

2024年，`Python`をちゃんと研究で使う可能性が出てきたのでここらで環境を整理しようと思いました．
まず`Anaconda`のお掃除ですがこちらの記事を参考にしましたので貼っておきます．
https://weblabo.oscasierra.net/python-anaconda-uninstall-macos/
</details>

# 環境
| name | version |
|:-:|:-:|
|  MacBook Pro | Sonoma 14.3.1  |
| Homebrew  |  4.3.2 |
| pyenv  | 2.4.1  |
|VSCode|1.89.1|

# 本題
1. [`pyenv`の導入](##`pyenv`の導入)
1. [`pyenv`で`Python`をインストール](##`pyenv`で`Python`をインストール)
1. [`venv`で仮想環境の作成](##`venv`で仮想環境の作成)


## `pyenv`の導入
`pyenv`は`Python`の複数バージョン管理を目的に導入します．

`Homebrew`を使ってインストールします．
```terminal
brew install pyenv
```

インストールが終わったら以下の内容を`.zshrc`に書き込みます．`pyenv`を使うための事前準備です．
```.zshrc
# pyenvの初期設定
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init --path)"
fi
```
書き終わったらターミナルで以下を実行し，`.zshrc`の内容を反映させます．
```terminal
source ~/.zshrc
```

## `pyenv`で`Python`をインストール
以下のコマンドでインストールできるもののリストが表示できます．
```terminal
pyenv install --list
```
いっぱい出てきてびっくりしますが，上の方にスクロールしていくと数字だけの部分が出てきます．これが素の`Python`のバージョンです．
```terminal
  3.9.18
  3.9.19
  3.10.0
  ...
  3.12.2
  3.12.3
```
今回は`3.12.3`と`3.9.19`をインストールします．
インストールは以下のコマンドです．
```terminal
pyenv install 3.12.3
```
```terminal
pyenv install 3.9.19
```
これでインストールできました．実際に入ったか確認してみましょう．
```terminal
pyenv versions
```
で確認できます．
```terminal
username@somewhere ~ % pyenv versions
* system (set by /Users/username/.pyenv/version)
  3.9.19
  3.12.3
```
おそらくこのような表示になると思います．

（私の環境ではなぜか`system`がMac標準の`Python`へのパスを示さず彷徨っています．特に不都合はないので放置していますがなにかわかる方いらっしゃれば教えていただけると幸いです．）

`*`がついているものが今選択されている`Python`のバージョンです．
では先程入れた`3.12.3`に変更してみましょう．
```terminal
pyenv global 3.12.3
```
`pyenv versions`を実行してもらえれば`*`の位置が変わっていることがわかると思います．
試しに`python --version`や`which python`を叩いてみてください．

ここまでで`pyenv`経由でインストールした`Python`を利用することができるようになりました．
次は`venv`での仮想環境の作成です．

## `venv`で仮想環境の作成
簡単です．
```terminal
python -m venv [仮想環境名]
```
とするだけです．

今回は`root`直下に仮想環境をまとめていきたいので次の準備を行います．
```terminal
cd          //rootに移動
mkdir venvs //ディレクトリvenvsを作成
cd venvs    //venvsに移動
```
以上を1行ずつ実行してください．

次に仮想環境`base`を作成します．`venvs`にいる状態で以下のコマンドを叩いてください．
```terminal
python -m venv base
```
これで`python3.12.3`の仮想環境を作ることができました．
まだこの状態では仮想環境はアクティブでないので
```terminal
source ./base/bin/activate
```
と打ってください．この状態で`pip`を用いパッケージをインストールするとこの`base`仮想環境のみにパッケージが入ります．


`python3.9.19`の仮想環境を作りたい場合は`pyenv global 3.9.19`でグローバルのPythonを変更してから上記の手順を踏めばOKです．

仮想環境の切り方はターミナルで`deactivate`と叩いてください．

## VSCodeの設定
設定という設定ではありませんが，`~/Documents/SugoiProject`があるとします．`SugoiProject`の中には`sugoi_program.py`が入っています．

1. vscodeで`SugoiProject`を開きます
1. `shift`+`command`+`P`でコマンドパレットを開きます
1. 「python インタープリター」と入力すると「Python: インタープリターを選択」が出てくるのでクリック
1. 作成した仮想環境へのパス，今回は`~/venvs/base/`を入力

これでvscodeが`python`を見つけてくれます．

`~/venvs`でまとめて管理することでvscodeでの使い勝手もよく，どの環境になんのパッケージを入れたかも管理しやすいと思います．また`requirements.txt`で複製するケースと比べていつの段階で複製したか（複製先には追加で入れたけど複製元には入れてないケース）を気にする必要がない点もメリットです．


## 正直毎回グローバル設定するのだるい
https://qiita.com/yuba/items/34a574d936d898478773

執筆中に見つけました．仮想環境の`Python`バージョンを指定して作成するにはグローバルの`Python`を設定し直さなくてはいけません．いちいち`pyenv global [version]`と打つのもだるいので，エイリアス登録してしまいましょう．

`.zshrc`に
```.zshrc
# alias
alias python3.9="$HOME/.pyenv/versions/3.9.19/bin/python3.9"
alias python3.12="$HOME/.pyenv/versions/3.12.3/bin/python3.12"
```
とかくだけです．（例によって`source ~/.zshrc`を忘れずに）

`python3.9.19`で仮想環境を作りたければ
```terminal
python3.9 -m venv [仮想環境名]
```
とすればOKというわけです．便利ですね．

# おまけ
パッケージ追加したくて仮想環境をアクティブにするとき，`source ~/venvs/base/bin/activate`と打つのもだるいですよね．短いコマンドに変えちゃいましょう．
```.zshrc
alias actv_base="source /Users/{username}/venvs/base/bin/activate"
```
`actv_base`と打つだけで`base`がアクティブになります．楽ですね．

# その他の参考サイト
https://zenn.dev/antyuntyun/articles/pyenv_warning_resolve

https://qiita.com/shun_sakamoto/items/7944d0ac4d30edf91fde

https://qiita.com/toast-uz/items/f2df428f75b049b1d172