pyenvとvenvを使ったPython仮想環境の構築（Windows11 vs Apple Silicon Mac）

Pythonの仮想環境の構築は素の状態からすることはあまりなく、すべての工程になると忘れがちです。また、OSによってもかなり異なる部分がありました。そこで、pyenvとvenvを使った仮想環境の構築方法をOS間で比較するような形でまとめてみました。

## Python本体のインストール

### Windows11

Windows11の場合は素の状態ではPythonがインストールされていないので、インストーラーを公式からダウンロードしてインストールします。以下のリンク先はPython 3.11.0のインストーラーのダウンロードページです。

https://www.python.org/downloads/release/python-3110/

パスを通す設定でインストールします。

![インストーラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/773995/12c1b8b1-168c-7cb7-9e08-01e91dba7027.png)

### Mac

Macの場合はデフォルトでPythonが入っていて`python3`で起動します。

## pyenvのインストール

### Windows11

https://github.com/pyenv-win/pyenv-win/blob/master/docs/installation.md

PowerShellを開いて以下のコマンドの実行します。

``` powershell
pip install pyenv-win --target $HOME\\.pyenv
```

続いて、以下のコマンドを実行して`PYENV`と`PYENV_HOME`、`PYENV_ROOT`を環境変数に追加します。

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

最後に以下のコマンドで`\.pyenv\pyenv-win\bin` `\.pyenv\pyenv-win\shims`をパスに追加したらインストール完了です。

``` powershell
[System.Environment]::SetEnvironmentVariable('path', $env:USERPROFILE + "\.pyenv\pyenv-win\bin;" + $env:USERPROFILE + "\.pyenv\pyenv-win\shims;" + [System.Environment]::GetEnvironmentVariable('path', "User"),"User")
```

### Mac

HomeBrewがインストールされていない場合はこれをインストールします 

https://brew.sh/

インストールは以下のコマンドで行います。

``` zsh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

最後に以下のコマンドでパスを通して完了です。

``` zsh
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/<ユーザー名>/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
```

続いてpyenvをインストールします。

https://github.com/pyenv/pyenv/blob/master/README.md#set-up-your-shell-environment-for-pyenv

以下のコマンドでpyenvをインストールしたら、

``` zsh
brew update
brew install pyenv
```

以下のコマンドでパスを通して完了です。

``` zsh
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

## pyenvでのPythonバージョンの切り替え

ここからはWindows/Mac共通です。

以下のコマンドを打つとインストール可能なPythonのバージョンリストが表示されます。

``` zsh
pyenv install -l
```

その中からインストールしたいバージョンを選び以下のようなコマンドでインストールします。

``` zsh
pyenv install 3.10.0
```

pyenvでインストールされているPythonの中から以下のようにバージョンを指定すると使用するPythonのバージョンを切り替えられます。

``` zsh
pyenv global 3.10.0
```

`pyenv global` とだけ打つと、指定されているバージョンを確認できます。また、インストールされているPythonのバージョンリストは`pyenv versions`で確認できます。

## 仮想環境構築

https://docs.python.org/3/library/venv.html

以下のコマンドを実行すると指定したパスに指定した名前の仮想環境が構築されます。

``` zsh
python -m venv パス/<仮想環境名>
```

Windowsではデフォルトでインタプリタもコピーされますが、Macだとインタプリタはコピーされずリンクファイルだけ作られます。インタプリタもコピーさせたい場合は`--copies`オプションを付けます。

``` zsh
python -m venv パス/<仮想環境名> --copies 
```

VSCodeでPythonのインタプリタを指定することで使用する仮想環境を切り替えたいとき、Macではインタプリタをコピーしておかないと上手く指定できません。ただし、プロジェクト毎に専用の仮想環境を作るのであれば特に意識する必要はないと思います。

## 仮想環境のアクティベート

以下のコマンドで仮想環境がアクティベートされます。

### Windows11

``` powershell
<venv>\Scripts\Activate.ps1
```

### Mac

``` zsh
source <venv>/bin/activate
```

どちらも`deactivate`で仮想環境を抜けることができます。