WSLとWindows両方にpyenv(windowsはpyenv-win)をインストールすると、WSLでpyenvが使えなくなる。

WSLの起動時に
/mnt/c/users/hogeuser/.pyenv/pyenv-win/bin/pyenv: 3: cygpath: not found
のようなエラーメッセージが表示される。

これは、~/.bashrcでpyenvのPATHを通そうとする際に、
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
このように設計されているためである。
(なぜかはわからない)

このコマンドの内容は、
command -v pyenv >/dev/nullでpyenvというコマンドが存在するかを確認し、存在する場合は何もせず、存在しない場合、export PATH="$PYENV_ROOT/bin:$PATH"でパスを通す、というものです。

通常、パスを通す前はpyenvコマンドは存在しないので、前者のコマンドは常にFalse-likeとなり、常に後者のコマンドが実行され、パスが通される。

しかし、WSLの場合、Windowsのコマンドを実行することができる(Windowsのパスも参照できる)。
そのため、Windowsにpyenvが存在する場合、前者のコマンドはTrue-like(コマンドのフルパスが返ってくる)になるので、後者のパスを通すコマンドが実行されない。

結果、pyenvを実行するとWindows上のものが実行され、エラーが発生する。

なお、起動時のエラー/mnt/c/users/hogeuser/.pyenv/pyenv-win/bin/pyenv: 3: cygpath: not foundなどは、command -v pyenv >/dev/nullの段階でWindows上のpyenvをLinuxから実行したことで発生している。
Windowsのpyenvでは、Windowsのコマンドcygpathなどを実行しようとするが、Linuxから実行されているので見つからずに上のエラーが発生する。

解決策

~/.bashrccommand -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"の条件部分を消し、単にexport PATH="$PYENV_ROOT/bin:$PATH"とする。

pyenvの公式手順通りにインストールした場合は、~/.profileにも同じコマンドが書かれているので、そこも同様に書き換える。

なお、前述のとおり、わざわざそのような構成になっている理由はわからないので、不具合が出たらすみません。

投稿者 admin

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です