【Python】Windows + pyenv + VSCode 開発環境

# 2022/03/02 追記
- つまずきポイント、まだありました。
    - 「Pythonのインストール」について
        - パスの追加が必要なので、手順に追記しました。
    - 「環境変数の設定」について
        - 管理者権限のないユーザーが”自身の”環境変数を変更できる方法に修正しました。

# はじめに
- この記事は、Windows環境においてpyenvでPythonの仮想環境を作り、VSCodeで開発を行いたい方向けの記事です。
- ~~Windows環境（WSLなどLinux環境が使えない）でAnacondaから卒業しつつ、Jupyter Notebookで開発したい友人向けの記事です。~~

# 参考
- 基本的には下記のページで紹介されている方法に従います。
    - [【2021年最新版】Windowsでpyenvを使う方法](https://www.3ryu-engineer.work/windows-pyenv/)
- しかし、思わぬところにつまづきポイントが有ったので、この記事を書くに至りました。

# Pythonのインストール
- WindowsにPythonをインストールします。
    - このPythonは後述のpyenv-winのインストールにのみ使用します。
- ここでは、Windows Storeが使えない想定で、下記の公式サイトにアクセスし、インストーラをダウンロードします。
    - https://www.python.org/downloads/
    - 最新版でOKです。
    - この記事では、`v3.10.2`を選択しました。
- 「Install Python 3.X.X」の画面が表示されたら、下の「Add Python 3.X to PATH」のチェックボックスにチェックをします。
- 「Install Now」をクリックします。
    - 「Customize installation」の方を選択すると、お好みによってインストール先ディレクトリを変更することができます。
- インストールが完了したら、PowerShellを立ち上げて、以下のコマンドで確認します。

```powershell
python --version
# Python 3.10.2
```

# pyenv-winのインストール
- pipコマンドでpyenv-winをインストールします。PowerShell or コマンドプロンプトでコマンドが異なるので注意です。
    - PowerShellでは、以下のコマンドを実行します。
        - `pip install pyenv-win --target $HOME\\.pyenv`
    - コマンドプロンプトでは、以下のコマンドを実行します。
        - `pip install pyenv-win --target %USERPROFILE%\.pyenv`
- インストールが完了すると、ユーザーディレクトリ配下に`.pyenv`というディレクトリが生成されます。
- 以下のようなWarningが出ることがありますが、問題ないので無視します。
```
WARNING: You are using pip version 21.2.4; however, version 22.0.3 is available.
```

# 環境変数の設定
- [コントロールパネル]→「ユーザー アカウント」→「ユーザー アカウント」を開きます。
- 左欄の「環境変数の変更」をクリックします。
- 「[ユーザー名]のユーザー環境変数」に環境変数を追加・編集します。（下段にある「システム環境変数」は触りません。）
    - 環境変数`PYENV`を追加します。
        - 「新規」をクリックし、以下の情報を入力します。
            - 変数名：`PYENV`
            - 変数値：`C:\Users\[ユーザー名]\.pyenv\pyenv-win`
                - 「ディレクトリの参照」から`.pyenv`をインストールした先を選択してもOKです。
    - 環境変数`Path`を編集します。
        - `Path`を選択し、「編集」をクリックします。
        - 「新規」をクリックし、以下のパスを入力します。
            - `C:\Users\[ユーザー名]\.pyenv\pyenv-win\bin`
            - `C:\Users\[ユーザー名]\.pyenv\pyenv-win\shims`
        - 上の2つのパスを選択し、「上へ」をクリックすることで、一番上に持ってきます。
        - この操作で、上の2つのパスが記事の最初の方で入れたPython（v3.10.2）よりも優先されて、pyenvによる仮想環境が使えるようになります。
    - 補足
        - 参考記事では、`%XXXX%`を利用して環境変数の追加・登録をしていましたが、これだとVSCodeで環境変数がうまく読み込めないという不具合に陥りました。したがって、フルパス入力によって追加・編集をした方が無難だと思います。

# pyenvによる仮想環境の作成
- コンソール（Poweshell、コマンドプロンプト）を立ち上げ直し、環境変数の変更を反映します。
- pyenvが使えることを確認します。

```powershell
pyenv --version
# pyenv 2.64.11
```

- お好みのバージョンのPythonをインストールします。

```powershell
pyenv install --list  # インストール可能なバージョン一覧を表示
pyenv install 3.8.10  # ここでは`v3.8.10`を選択
pyenv global 3.8.10
pyenv versions
# * 3.8.10 (set by C:\Users\[ユーザー名]\.pyenv\pyenv-win\version)
```

- PowerShellで`python`コマンドを実行して確認します。

```powershell
python
# Python 3.8.10 (tags/v3.8.10:3d8993a, May  3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
# Type "help", "copyright", "credits" or "license" for more information.
# >>>
```

- `pip`コマンドでお好みのライブラリをインストールします。
    - ここでのpipはPython 3.8.10のpipなのでライブラリは以下のディレクトリにインストールされます。
        - `C:\Users\[ユーザー名]\.pyenv\pyenv-win\versions\3.8.10\Lib\site-packages`
    - ~~友人向けコマンド~~

```Powershell
pip install -U pip setuptools
pip install numpy pandas matplotlib seaborn notebook
```
- 以下のようなErrorが出ることがありますが、問題ないので無視します。（これに関しては謎です。）
```
ERROR: Could not install packages due to an OSError: [WinError 5] アクセスが拒否されました。
```

# VSCodeの設定
- 左サイドバーで「拡張機能」をクリックし、「Python」、「Pylance」、「Jupyter」をインストールします。
- インストールが完了したら、再読み込みを行います。
- 上メニューの「ファイル」→「フォルダを開く」で作業フォルダを開きます。
- `*.py`の開発・デバッグを行うための前準備としては、ウィンドウ左下の「インタープリターを選択」で、この記事で導入した「Python 3.8.10 64-bit ('3.8.10': pyenv)」を選択します。
- `*.ipynb`の開発を行うための前準備としては、対象の`*.ipynb`を開き、画面右上の表示される「カーネルの選択」から「3.8.10 (Python 3.8.10)」を選択します。
- 以上で開発環境が整います。
- https://seaborn.pydata.org/examples/different_scatter_variables.html
![スクリーンショット 2022-02-22 213734.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580613/1c39409c-4f62-708e-f3d4-610a85e7b4dd.png)

# あとがき
- この記事では、Windowsにおいてpyenvで仮想環境を作り、VSCodeで開発を行うまでを解説しました。
- Jupyter Notebookを用いた開発環境はいくつか種類があると思いますが、VSCodeでは、フォントが選べる、補完機能やF12ジャンプなどの便利機能が使える、などメリットが多いのでこの環境での開発を紹介したく、記事を書きました。