WSL2 上の Ubuntu 22.04.1 LTS に pyenv 環境を作ろうとしてハマったので対応策のメモ
実行した手順
GitHub の pyenv のページに書かれている手順に従い、
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
を実行し、シェルの再起動
$ exec "$SHELL"
ここで
/mnt/c/Users/mare_ism/.pyenv/pyenv-win/bin/pyenv: 3: cygpath: not found
/mnt/c/Users/mare_ism/.pyenv/pyenv-win/bin/pyenv: 3: exec: cmd: not found
というエラーメッセージが出てしまう。
当然、pyenv のバージョン確認
$ pyenv --version
を実行しても同じメッセージが出る。
原因調査
エラーメッセージを見れば分かるように、マウントした Windows のフォルダを見に行ってしまっている。(Windows 側では既に pyenv の環境を構築済み)
パスを確認すると
$ echo $PATH
/mnt/c/Users/mare_ism/.pyenv/pyenv-win/bin/
にパスが通っているのが分かった。ここにある Windows 用の pyenv を実行しようとしてエラーが発生しているわけだ。
パスを追加しているはずじゃないの?
Ubuntu 側の pyenv にパスを通すために
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
を実行しているが、これは pyenv が見つからなかったときに $PYENV_ROOT/bin
(つまり、$HOME/.pyenv/bin
)をパスに追加する、というコマンドになっている。
しかし、
$ command -v pyenv
を実行すると
/mnt/c/Users/mare_ism/.pyenv/pyenv-win/bin/pyenv
が返ってきてしまい、||
以降のコマンドが実行されないままになっていた。
対応方法
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
のコマンドを
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
に変更して実行。
既に元のコマンドを実行している場合は .bashrc
ファイルの末尾が
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
ではなく
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
になるように直接編集してもよい。
実行結果
改めてシェルを再起動し、pyenv のバージョン確認
$ pyenv --version
の結果が
pyenv 2.3.6-4-g904fe964
と表示された。