Pythonのバージョン切り替えと仮想環境の構築をpyenv＋venvで実現してみた【2021年版】

## はじめに

古いバージョンで構築されたシステムを新しいバージョンで構築しなおす、なんて話は割とよくある話だと思います。
しかも稼働環境はLinuxだけど、開発環境はWindowsなんてこともよくある話。
今回は私が実際に採用した方法についてメモを残したいと思います。

## 環境

* OS：Windows 10 Pro
* エディタ：Visual Studio Code

## 実現方法

pyenvでバージョンの切り替えを行い、venvで仮想環境を構築します。
仕事で使うということから、なるべく実績がありかつ可能な限り標準搭載の機能で実現できるということを重視しました。

## 前提

pyenvのセットアップにpipを使うので、とりあえずPythonの[最新バージョン](https://www.python.org/downloads/)をインストールしておきます。(執筆時点の最新バージョンは3.9.5)

## pyenvのセットアップ

### インストール

Powershellの場合は以下を実行します。

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

コマンドプロンプトの場合は以下を実行します。

```cmd
pip install pyenv-win --target %USERPROFILE%\.pyenv
```

上記のいずれかを実行するとHOMEディレクトリ(通常 C:\Users\{ユーザー名})に`.pyenv`というフォルダが作成され、そこにインストールされます。

上記以外にも[pyenv-winの公式](https://github.com/pyenv-win/pyenv-win#installation)にはZipファイルやGitからインストールする方法が載っていますが、おそらく上記が一番手軽で確実かと思います。

### 環境変数の追加

pyenvコマンドをどこからでも実行できるように、環境変数にパスを追加します。パスを通すってやつです。

Powershellを開いて、以下を3つのコマンドを実行します。

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

### Powershellの再起動

設定した環境変数を有効化するため、Powershellを再起動します。

### 確認

立ち上げなおしたPowershellで以下を実行します。

```bash
pyenv --version
```

pyenvのバージョンが表示されれば成功です（執筆時点では2.64.7.2）

### 目的のバージョンをインストール

Powershellで以下を実行すると、今現在pyenvで管理できるバージョンの一覧が表示されます。

```bash
pyenv install -l
```

私の場合は3.7.4と3.9.4が必要なので、以下の通り実行します。

```bash
pyenv install 3.7.4
pyenv install 3.9.4
```

### インストールされているバージョンを確認

Powershellで以下を実行すると、pyenvで切り替えられるバージョンの一覧を確認できます（実行ファイルでインストールしたバージョンとは異なります）

```bash
pyenv versions
```

私の環境では以下の通り表示されます。

```bash
  3.7.4
  3.9.4
```
### 環境設定

Powershellで以下の通り実行すると、デフォルトのバージョンを設定することができます。

```bash
pyenv global 3.9.4
```

この段階でもう一度 `pyenv versions` を実行すると、以下のように表示されます。

```bash
  3.7.4
* 3.9.4 (set by C:\Users\{ユーザー名}\.pyenv\pyenv-win\version)
```

これでひとまずバージョンを切り替える環境が整いました。

### Visual Studio Codeでのバージョン切り替え

Visual Studio Codeを立ち上げPython開発用のワークスペースを開きます。通常のPython環境であれば、画面左下のステータスバーに `Python 3.9.5 64-bit` のように表示されていると思います。この例では現在の環境の（実行ファイルでインストールした）バージョンが表示されています。これをpyenvでインストールしたバージョンと自由に切り替えることができます。

バージョン切り替えは上記のステータスバーに表示されている `Python 3.9.5 64-bit` をクリックします。すると画面上部にインタープリターを切り替えることができるドロップダウンが表示され、ここにpyenvでインストールしたバージョンが選択肢として表示されます。

## venvのセットアップ

### 構築する仮想環境のバージョンに切り替える

ワークスペースを開いた状態で、使いたいPythonのバージョンに切り替えます。
その後「ターミナル」メニューの「新しいターミナル」を選択すると、ターミナルウィンドが開きます。
ここで以下のコマンドを実行して、現在のバージョンを念のため確認します。

```bash
python -V
```

### 仮想環境を生成する

開いているターミナルで以下のコマンドを実行すると、仮想環境を構築できます。

```bash
python -m venv .venv
```

最後の `.venv` は生成される仮想環境名（＝フォルダ名）になります。任意ですが、`.venv`とするのが一般的のようです。
バージョンを明確にするため、`.venv39` とかにしても良いかもしれません。

生成が完了したら以下のコマンド実行して、仮想環境を有効化します。

```bash
.\.venv\Scripts\activate
```

`.venv` の部分は先ほどのフォルダ名ですので、ご自身で入力した値に読み替えてください。

以上で仮想環境が構築されましたが、Visual Studio Codeに反映させるために、一度Visual Studio Codeを再起動してください。

### ワークスペースに反映する

再起動後にステータスバーのPythonバージョン表示箇所をクリックしてインタープリター選択状態にすると、作成した仮想環境が選択肢に出ていると思のでそれを選択します。
すろとステータスバーのバージョン表示にも仮想環境を表す `venv` が表示されていると思います。

## おわりに

以上で構築完了です。
ちなみに新しい仮想環境にはモジュールは入っていません。
仮想環境ではない通常の環境でインストールしていても、仮想環境はクリーンな状態ですので、改めてインストールする必要があります。
まぁそれが狙いでもあるんですが。

またモジュールを管理する `pip` 自体も古いバージョンのものが入りますので、必要に応じて（アップデートを促されたら）バージョンアップしましょう。

ではよいPythonistaライフを！！