コンテンツにスキップ

Windowsでpyenv(pyenv-win)をインストールする方法

はじめに

私は普段PythonのコードをWSLで実行していますが、WSLとは別にWindows側でもPythonを実行する必要がありました。

WSLではpyenvを使用してPythonをバージョン管理しているため、Windows側でも同様に使用することを考えましたが、pyenv は公式ドキュメントにWindowsを公式にサポートしておらず、Linux用のWindowsサブシステム以外のWindowsでは動作しまいことが記載されており、pyenv-win1を使用することが推奨されていました。

本記事では、pyenv-winの公式ドキュメントを元に確認したインストール方法とWSLのpyenvとの共存方法、PowerShellスクリプトによる更新方法についてまとめたので紹介します。

注意事項

本記事は2024/09/16時点の情報です。
最新の情報とは異なる場合がありますので参考になる際はご注意ください。

参考記事

Ubuntu環境でのpyenvのインストール方法は下記の記事を参照ください。

pyenv-winのインストール方法

以下の公式手順より、powershellからgitコマンドでpyenv-winコマンドをインストールします。

1
git clone https://github.com/pyenv-win/pyenv-win.git "$HOME/.pyenv"

環境変数設定

以下の公式手順より、環境変数を設定します。

環境変数にPYENV, PYENV_HOME, PYENV_ROOTを追加します。

1
2
3
4
5
[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コマンドを実行するために、USER PATH変数に以下のパスを追加します。
念のため、環境変数の編集から実際に上記変数が追加されていることも確認してください。
もし、登録内容に誤りがある場合は、手動で削除して新規追加してください。

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

以下が表示されれば成功です。

1
2
3
4
5
6
7
> gcm pyenv | fl


Path               : C:\Users\username-win\.pyenv\pyenv-win\bin\pyenv.ps1
Definition         : C:\Users\username-win\.pyenv\pyenv-win\bin\pyenv.ps1
Source             : C:\Users\username-win\.pyenv\pyenv-win\bin\pyenv.ps1

1
2
pyenv --version
pyenv 3.1.1

【必要な場合のみ】既にWSLでpyenvを使用している場合の設定について

Windows側でpyenv-winをインストールするとWSL側の$PATHpyenv-winが追加されました。
パスの順番次第ですが、WSLで既にpyenvを使用している場合、pyenv-winが優先され、WSL上でインストールした.pyenvを使用できない場合があります。
そこで、Windows側のpyenv-winを明示的に$PATHから除外します。

注意事項

  • 実行する前に必ず.bashrcをバックアップしてください。
  • username_winは使用中のWindowsのユーザ名に置き換えてください。
  • usernameは使用中のWSL環境のUNIX usernameに置き換えてください。
1
cp ~/.bashrc ~/.bashrc.backup

手順

WSL側で$PATHを確認します。pyenv-winが存在する場合は対象です。

1
2
3
4
$ echo $PATH | tr ':' '\n' | grep '/mnt/c/.*AppData'

/mnt/c/Users/username_win/.pyenv/pyenv-win/bin
/mnt/c/Users/username_win/.pyenv/pyenv-win/shims

~/.bashrcに以下関数を追加します。

1
2
3
4
5
6
7
# Function to remove Windows pyenv from PATH
remove_windows_pyenv() {
    echo "$PATH" | tr ':' '\n' | grep -v "/mnt/c/.*pyenv-win" | tr '\n' ':' | sed 's/:$//'
}

# Apply the function to clean PATH
export PATH=$(remove_windows_pyenv)

再度パスを確認し、pyenv-winが存在しないことと、WSL側のpyenvのコマンドのパスが表示されれば成功です。

1
2
$ which pyenv
/home/username/.pyenv/bin/pyenv

【必要な場合のみ】pyenv-winを更新する関数を新規作成する

pyenv-winでは更新用のコマンドが存在しないため、関数を追加して対応します。

username_winは使用中のWindowsのユーザ名に置き換えてください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function pyenvup {
    $originalLocation = Get-Location
    try {
        Set-Location $env:PYENV
        $gitOutput = git pull 2>&1
        if ($LASTEXITCODE -ne 0) {
            if ($gitOutput -match "detected dubious ownership") {
                Write-Warning "Detected dubious ownership. Attempting to add safe directory..."
                git config --global --add safe.directory C:/Users/username_win/.pyenv
                $gitOutput = git pull 2>&1
                if ($LASTEXITCODE -ne 0) {
                    Write-Error "Git pull failed after adding safe directory: $gitOutput"
                    return
                }
            }
            else {
                Write-Error "Git pull failed: $gitOutput"
                return
            }
        }
        Write-Host "pyenv has been updated successfully" -ForegroundColor Green
    }
    catch {
        Write-Error "An error occurred: $_"
    }
    finally {
        Set-Location $originalLocation
    }
}

この関数を永続的に使用できるようにするためにPowerShellプロファイルに追加します。

はじめに、PowerShellで以下のコマンドを実行して、PowerShellプロファイルが存在するか確認します。

1
Test-Path $PROFILE

もし False が返される場合は以下のコマンドでプロファイルを作成してください。

1
New-Item -Path $PROFILE -Type File -Force

次に、プロファイルを編集するために以下のコマンドを実行し、上記の関数定義をファイルに追記して保存します。

1
notepad $PROFILE

保存後に以下のコマンドでプロファイルを再読み込みします。

1
. $PROFILE

これで PowerShell で pyenvup と入力すると、pyenv ディレクトリに移動し、git pullを実行してpyenv-winを更新し、元のディレクトリに戻ります。

まとめ

Windowsでpyenv(pyenv-win)をインストールする方法について紹介しました。

WSLはWSL2が提供され、インストールから利用まで問題なく環境構築できるようになっていますが、Windows環境でもpythonをバージョン管理してコードを実行したいケースはあると思います。本記事がそのような場合の参考となれば幸いです。


  1. pyenv-winは、pyenvのコンセプトや仕様を基に、Windows環境向けに独自実装されたPython向けのバージョン管理ツールです。