Posted at

fishermanのpyenvが有効にならないときの対処法


状況

最近fishを使い始めました!

が、fishermanのpyenvを入れているのにpyenvにパスが通っておらず、システムデフォルトのpythonが起動する現象が起こったので、その対処法について書きます。

環境

OS: macOS High Sierra

Shell: fish

Terminal: iTerm2


解決策

公式のドキュメントどおりにfishermanをインストールし、fishermanのpyenvを導入していれば、

$HOME/.config/fisherman/pyenv/conf.d/の中にpyenv.fishというファイルがあるかと思います。

そのファイルの15〜18行目

if status --is-login

set -x PATH "$pyenv_root/shims" $PATH
set -x PYENV_SHELL fish
end

のif文とインデントを消して、

set -x PATH "$pyenv_root/shims" $PATH

set -x PYENV_SHELL fish

に変えましょう。

ログインし直せば$HOME/.pyenv/shimsにパスが通り、普段どおりpythonが使えるはずです。


理由

おそらく、こんなことが起こる場合はかなり限らています。

上のコード上でif status --is-loginがfalseで評価されている場合です。

statusはfish上でfishがログインシェルかどうかを確認できるコマンドです。

私は標準のターミナルではbashを使い、iTermsではfishを起動するようにしており、つまり

chsh -s /usr/local/bin/fishをせずに、iTermsのPreferencesからfishを指定しています。

なので、システム上ではfishがログインシェルではないため、if文が実行されず、pyenvにパスが通らなかったのだと思います。

試しにstatusコマンドを打てばThis is not a login shellと出るはずです。


おわりに

わざわざターミナル毎にシェルを変える人はあまりいないような気はするので、この記事が読まれることはないかもしれません。