pyenvを使って任意のバージョンのPython環境を構築する

# pyenvをWindows環境にインストールする

バージョンを指定してpython環境を構築する必要に出くわす事があります。「このリポジトリはpython3.11をサポートしていません。」などという場合は、python3.11しかインストールされていない環境の場合、python3.10以下を新たにインストールして場合に応じて切り替えなくてはなりませんが、pyenvはその作業を自動的に処理してくれます。

まず、pyenvをWindows環境する方法を見ていきましょう。
公式のpyenv-winのリポジトリでは、以下の方法でインストールできると説明があります。

1. PowerShellからインストールする方法（最も簡単な方法）
2. Git Commandsからインストールする方法
3. Pyenv-winのzipファイルから
4. Pythonのpipコマンドを使用した方法
5. Chocolatey

ここでは、主にPowershellを使ってインストールする方法を中心に個人的な備忘録を兼ねて記事にします。

# Powershellを使用したpyenv-winのインストール

```pwsh
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
```

もし、権限の関係で以下のようなエラーが発生した場合は、適切な権限を設定してください。
```pwsh
& : File C:\Users\ユーザー名\install-pyenv-win.ps1 cannot be loaded because running scripts is disabled on this system. For
more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:***
+ ... n.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~ 
 + CategoryInfo          : SecurityError: (:) [], PSSecurityException 
 + FullyQualifiedErrorId : UnauthorizedAccess
```

念のため、PowerShellを管理者権限で実行した上で、以下のように現在のユーザーに対して実行権限を、RemoteSignedとするのが妥当なところでしょうか。実際の実行権限については各人の判断でお願いします。

```pwsh
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
```

エラーが発生することなくコマンドの実行が終了したら、PowerShellを開き直して次のコマンドでバージョンが表示される事を確認しましょう。

`
pyenv --version
`

```pwsh
pyenv 3.1.1
```

こんな感じの画面が出ればpyenv本体ののインストールは成功です。
続いて、pyenvで使用するパスを環境変数に登録します。


pyenvのコマンド一覧を記載します。

```yml
   commands     使用可能なすべてのpyenvコマンドを一覧表示します
   local        ローカルのアプリケーション固有のPythonバージョンを設定または表示します
   global       グローバルなPythonバージョンを設定または表示します
   shell        シェル固有のPythonバージョンを設定または表示します
   install      1つ以上のPythonバージョンをインストールします
   uninstall    1つ以上のPythonバージョンをアンインストールします
   update       キャッシュされたバージョンDBを更新します
   rehash       pyenvshimsを再ハッシュします（Pythonバージョンを切り替えた後に実行してください）
   vname        現在のPythonバージョンを表示します
   version      現在のPythonバージョンとその由来を表示します
   version-name 現在のPythonバージョンを表示します
   versions     pyenvで利用可能なすべてのPythonバージョンを一覧表示します
   exec         選択されたPythonを使用するようにPATHを準備した後に実行可能ファイルを実行します
   which        実行可能ファイルへのフルパスを表示します
   whence       指定された実行可能ファイルを含むすべてのPythonバージョンを一覧表示します
```
さて、ここでバージョンを指定して必要なバージョンのpythonをインストールする方法を説明します。
まずは、必要なバージョンのPythonが利用可能な状態か念のため確認します。
`pyenv install` に `-l` オプション、または`--list`をつけて実行します。

`
pyenv install -l
`

`
pyenv install --list
`

試しに手元の環境でインストール可能なpythonを確認するため上記のコマンドを実行した結果です。
```
2.7.18
3.0a1-win32
3.0a1
............
3.0b2
3.0b3-win32
3.0rc3
3.0-win32
3.0
3.0.1-win32
3.0.1
..................
3.4.0
3.4.1rc1-win32
3.4.1rc1
3.4.1-win32
..................
3.4.4
3.5.0a1-win32
3.5.0a1
..................
3.6.1rc1
3.6.1-win32
3.6.1
3.6.2rc2
3.6.2-win32
3.6.2
3.6.3rc1-win32
..................
3.8.0rc1
3.8.0-win32
3.8.0
3.8.1rc1-win32
..................
3.9.0a1-win32
3.9.0a1
3.9.0a2-win32
3.9.0a2
3.9.0a3-win32
3.9.0a3
3.9.0a4-win32
.................
3.9.0
3.9.1rc1-win32
3.9.1rc1
3.9.1-win32
.................
3.9.12
3.9.13-win32
3.9.13
3.10.0a1-win32
3.10.0a1
3.10.0a2-win32
..................
3.10.0
..................
3.10.3
3.10.4-win32
3.10.4
3.10.5-win32
3.10.5
..................
3.11.0a7
..................
3.11.0b3
3.11.0b4-win32
3.11.0b4
```
あまりにもバージョン表示が長いため途中で省略していますが、ほとんどのバージョンが選択できると考えてよいでしょう。

実際には上記にあるようにベータ版(bが付くバージョン）、やリリース候補など（RCがつくバージョン）、-win32がつくバージョンなども表示されます。

アルファ版やベータ版が表示されるのは望ましくないと思うので、
それらが表示されないようにPowerShellで「a,b,rc」を含むバージョンを表示しないようにフィルタリングした関数を、pyenv-listという名称で使用出来るようにしておくと便利です。

以下に方法を示します。

```powershell
notepad.exe $PROFILE
```
PowerShellのコンソールで上記のように入力し、プロファイルファイルを編集します。
実際には、以下のコードを追加してください。

```powershell
function Get-PyenvList {
    pyenv install --list | Where-Object { $_ -notmatch 'a|b|rc|-win32' }
}
Set-Alias -Name pyenv-list -Value Get-PyenvList
```

入力したら、メモ帳を上書き保存して閉じてください。

これで、「'a|b|rc|-win32'」が含まれるバージョンは一覧に表示されなくなります。
要件に応じて、フィルタリングする文字列を編集してください。


では、実際に必要なバージョンのpythonをインストールします。ここでは、python3.10.5をインストールします。
`
pyenv install 3.10.5
`
pyenvを使ってインストールされたpythonのバージョンの一覧を調べるには次のコマンドを使用します。

```
pyenv versions
```
結果が以下のようになれば無事インストールされたという事になります。
```
:: [Info] ::  Mirror: https://www.python.org/ftp/python
:: [Downloading] ::  3.10.5 ...
:: [Downloading] ::  From https://www.python.org/ftp/python/3.10.5/python-3.10.5-amd64.exe
:: [Downloading] ::  To   C:\Users\-----\.pyenv\pyenv-win\install_cache\python-3.10.5-amd64.exe
:: [Installing] ::  3.10.5 ...
:: [Info] :: completed! 3.10.5
* 3.10.5 (set by C:\Users\-----\.pyenv\pyenv-win\version)
```

別のバージョンもインストールして確かめて見ましょう。
`
pyenv install 3.8.0
`
`
pyenv install 3.11.0
`

うまく行けば同じような画面が表示された後、「completed! バージョン名」と表示されるはずです。

3つのバージョンをインストールしたことになりますが、実際にpyenvで指定したバージョンのpythonがインストールされたか、以下のコマンドで確認しましょう。

```
pyenv versions
```
以下のように表示されれば、確実にpyenvから指定されたバージョンのpythonがインストールされています。
```
PS C:\Users\-----> pyenv versions
* 3.10.5 (set by C:\Users\-----\.pyenv\pyenv-win\version)
  3.11.0
  3.8.0
```
また、*がついているバージョンは、デフォルトに設定されているものになります。
デフォルトに設定するpythonのバージョンを指定するには、

```
pyenv global 3.11.0
```
のように、pyenv globalコマンドの後に、バージョン名を指定します。
この際、pyenv versionsで表示されたバージョン表記を必ず使用してください。
```
PS C:\Users\-----> pyenv versions
  3.10.5 (set by C:\Users\-----\.pyenv\pyenv-win\version)
* 3.11.0
  3.8.0
```
これで、ひとまず希望するバージョンのpython環境を構築できるようになりました。

また、リポジトリどこにPythonのバージョンを変えたい場合は、リポジトリのルートディレクトリで、
`pyenv local`コマンドを実行する事で、どのディレクトリ（フォルダ内にpythonのバージョンに関するファイルが作成され、優先的に使用されるようになります。
例えば、openai-cookbookのリポジトリをcloneして、手元のフォルダにコピーしたとしましょう。
そのフォルダ（リポジトリのコピー）ではpython 3.10.5を使用したい場合、ルートディレクトリに移動して、
```pwsh
PS > cd C:\Users\ユーザー名\------\*******\PycharmProjects\openai-cookbook
PS > pyenv local 3.10.5
```
とします。エラーが出ずに新しいコマンドプロンプトが表示されたら。そのフォルダ以下では、Pyenvでpython 3.10.5を使用するようにセットされたことになります。
確認してみましょう。

```pwsh
PS > cd C:\Users\ユーザー名\------\*******\openai-cookbook> pyenv local
```
これで以下のように表示されていれば、指定のフォルダーではpython 3.10.5を使用するように設定されたという事になります。
```pwsh
PS > cd C:\Users\ユーザー名\------\*******\openai-cookbook> pyenv local
3.10.5
```

openai-cookbookは新しいリポジトリに分類される中では比較的最新のバージョンのpythonとは相性がよくない印象なので、まずはpython3.10.5あたりで試して見るのもいいかもしれません。
なお、openai-cookbookにはpoetry環境を構築するのに必要な、pyproject.tomlファイルが存在しないため、このリポジトリで何かする場合は、Pythonのバージョン管理とは別に、venvやVirtualenvなどを使用して、pyenv-winで用意したpythonインタープリターを基に、仮想環境を作成した上で実行しましょう。

手軽なvenvを使用する場合は、以下のようにします。
```pwsh
PS > cd C:\Users\ユーザー名\------\*******\openai-cookbook> python -m venv venv
```
仮想環境が出来たら、仮想環境をアクティブにします。
```pwsh
PS > cd C:\Users\ユーザー名\------\*******\openai-cookbook> ./.venv/Scripts/Activate.ps1
```
仮想環境がアクティブになれば以下のような表示に切り替わります。

```pwsh
(.venv) PS C:\Users\ユーザー名\------\*******\openai-cookbook>
```
仮想環境から抜ける際は、deactivateで抜けます。
```pwsh
(.venv) PS C:\Users\ユーザー名\------\*******\openai-cookbook>deactivate
PS C:\Users\ユーザー名\------\*******\openai-cookbook>
```

pyenv-win実際のインストール方法には、pipコマンドを使用したものもあるためそちらも解説したいのですが、インストール方法が違うと、pyenvをアンインストールする手順も違ったりしてややこしいので、次の機会に解説します。
上記の方法は、既にpythonがインストールされていても問題無く動作するので、ひとまずはPowerShellでインストールしてみてもいいかと思います。

また、poetryのバージョン管理機能をpyenvに任せて、pyenvのpythonインタープリターを基に、poetryの実行環境を作るという方法が一番、pythonのバージョンと、仮想環境内の依存関係を同時に操作できて便利かと思います。

Windowsでのpoetryのインストール方法や、セットアップ方法も記事にしていきたいと思います。