pyenvでpythonのバージョン切り替えからvenv仮想環境を構築するまで

# この記事について
いつも忘れてしまうので手早く探せるようにメモ。
環境はdebian系のubuntu 20.04です、他の環境をお使いの場合はこの記事を参考にしながらご自身で調べてください。
* pyenvを使った方法と使わない方法両方あります。
    * pyenvとはpythonを複数バージョンを入れて切り替えてくれる便利ツールです
    * 具体的には[githubページ](https://github.com/pyenv/pyenv)をご覧ください。


# pyenvを使わない方

### まずはpythonとpipを入れます

* `apt install python3 python3-dev python3-venv`でまずpython関連を入れます
    * そしてpipをインストールします。色々な方法はありますが、ここでは一番簡単な方法を使う。
        * まず`apt install wget`でwgetを入れます。
        * そして`wget https://bootstrap.pypa.io/get-pip.py`でpipを入れるためのpython scriptをダウンロードします
        * 最後に`python3 ./get-pip.py`で先ダウンロードしたscriptを実行して実際にpipを入れます
        * root userでpipを入れるとvenv使ってくださいという警告が出るが、別にインストールに失敗したわけではありませんので、大丈夫です
### 入れたら実際にvenvを作ります
* `mkdir <your_work_dir_name> && cd <your_work_dir_name>`で作業フォルダーを作って入ります
* `python3 -m venv <your_venv_name>`でvenv作成
* `source ./<your_venv_name>/bin/activate`でvenv起動
* ターミナル先頭に`（<your_venv_name>）`のようなものが付いていれば成功です
* 一応`pip3 --version`で確認、pathがvenvになってたら成功

### venvから抜ける
* `deactivate`を直接実行すれば抜けれる
* 効かない場合は`source deactivate`をお試しください

## pyenvを使って同時に複数バージョンのpythonとvenvを管理する

### まずpyenvを入れます
色々な方法はありますが、一番簡単なを使います
* `curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash` でpyenvを入れます
* 入れたらおそらくpathが通ってないので、`~/.bashrc`というファイルを書き換えてpathを通します
    * 手持ちのvimやviなどの編集ツールを使ってコードを追加しましょう。追加するコードは4行です。
    * `export PYENV_ROOT="$HOME/.pyenv"`
    * `command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"`
    * `eval "$(pyenv init -)"`
    * `eval "$(pyenv virtualenv-init -)"`
    * 以上４行を追加
* これでpyenvが使えるようになったはずです。`pyenv --version`で確認してみましょう

### そしてpyenv経由でpythonを入れる

真っ白な環境だと色々な依頼関係が入ってなかったりするので、適切にaptを使って下記のものインストールしてください
```bash
sudo apt install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
```
参考：　
[stack overflow](https://stackoverflow.com/questions/37227854/pyenv-build-failed-ubuntu-15-04-using-python-build-20160509)
[pyenv wiki](https://github.com/pyenv/pyenv/wiki/Common-build-problems)


そして入れたら pyenv で python をインストールすることができます
* `pyenv install 3.10.4`などで特定なバージョンを入れることができます、今回は3.10.4を入れます

### pyenv使ってvenvを作る
* `pyenv virtualenv 3.10.4 <your_venv_name>`でvenvを作ります、作るときは使用するpythonバージョンとvenv_nameを指定
    * pyenvを使用するときはディレクトリーを作らなくても直接venvを作成できます
    * venvファイルは`~/.pyenv/versions/<your_venv_name>`にあります

### venvの起動

pyenvでのvenvはpythonバージョンとして扱われるので、切り替える時もpython切り替えと同じです。

* サブディレクトリーだけでvenvを使う場合
    * `mkdir <your_work_dir_name> && cd <your_work_dir_name>`で作業フォルダーを作って入ります
    * `pyenv local <your_venv_name>`でこのディレクトリーでvenvを使用することを言明
    * そして実際に`.python-version`というファイルが作られるので、この中にvenvの名前が入ってます
    * これでこのサブディレクトリーに入ったら自動的にvenvに切り替えてくれて、抜けると自動的にvenvから抜けます
    * 試しに`cd ..`でディレクトリーを抜けましょう、実際にvenvからも抜けたはずです

## 221116追記

### macOS 13（zsh + apple sillicon）
brew経由でpyenvを入れるときに自動的にvitrualenvのpluginを入れてくれないので、手動で`brew install pyenv-virtualenv`入れることができます
### windows10（powerShell）
* PowerShell Script経由で導入したらpython cmdはシステムにインストールしていた旧バージョンのpythonと被ってしまったためpyenvで指定したとしても`gcm python | fl`はsystemを指してしまう
* 解決法としてはpathから`C:\Users\<your_user_name>\Local\Programs\Python\`に関するpathを全部消したら自動的にpyenvを使ってくれた
* virtualenv pluginはwindowsをサポートしていないらしいので、以下の手順を踏む必要がある
    * まず`mkdir <your_dir_name>`でvenvのフォルダーを置くディレクトリを作ります
    * `cd <your_dir_name>`で先作ったディレクトリに入ります
    * `pyenv local 3.10.4`もしくは`pyenv shell 3.10.4`でpython versionを指定する
    * `python -m venv <your_venv_name>`でvenvを作る
    * `.\<your_venv_name>\Scripts\Activate.ps1`で環境を起動します
    * `gcm python | fl`で検証します。Pathが先作ったvenvになってたら成功です
    * 念のため`pip --version`なども使って検証しましょう。同じくpathがvenvになってたら成功です
        * 筆者の環境だとvenvの中に入るとpython3，pip，pip3などのコマンドが効かなくなります、pythonだけが叩ける環境になってしまう
        * 別にエラーが出るとかではないだが、`python3 --version`、`pip --version`、`pip3 --version`などのコマンドが一切反応しなくなり、なにも出力がないという変な状態です。
        * `gcm pip | fl`で見てもちゃんとpathが通っているけどね。。。
        * 解決法としてはpipを使うときはpipじゃなくて`python -m pip`を使うとできるじゃできるけど、一向に謎です
        * わかる人がいましたらコメントお願いいたします。。。
    * 抜けるときは`deactivate`で抜けます

## 以上です