できない.dev

pyenv で Python のバージョンが切り替わらない

pyenv local や pyenv global を実行しても python --version が変わらない時は、shim より前にシステム Python が PATH 解決されているか、shell の rc に pyenv init が書かれていないことが多い。
rc と PATH を見直す。

#python#pyenv#version#shim#path

公開:

要約

pyenv は $PYENV_ROOT/shims 配下に python などのラッパースクリプトを置き、それを PATH の先頭に挿入することで python 呼び出しを横取りする。
shim パスが PATH に入っていない、または OS の python が先に解決されていると、pyenv local を打っても効かない。pyenv init を rc に書いて shell を再起動するのが基本対応。

よくある原因

  1. eval "$(pyenv init - bash)" を rc に書き忘れている、または zsh に乗り換えた際に .zshrc 側に転記していない
  2. which python/usr/bin/python3/opt/homebrew/bin/python3 を返しており、shim が PATH の後ろに居る
  3. .python-version が書き込まれたディレクトリでも pyenv versions に該当版が無く、グローバルバージョンにフォールバックしている
  4. CI で PYENV_VERSION を設定したまま消し忘れている
  5. macOS で Terminal がログインシェルでない設定になっており、.bash_profile だけに書いた pyenv 初期化が読まれていない

解決策

1. shell 初期化を確認

~/.bashrc または ~/.zshrc に次を追加する(pyenv 公式 README の手順)。

export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - bash)"

zsh は pyenv init - zsh に置き換える。
書いたら新しいターミナルを開く。

2. PATH の順序を確認

which python
# 期待: /Users/you/.pyenv/shims/python
echo $PATH | tr ':' '\n' | head -5

shim パスが上位に来ているか確認する。/usr/local/bin/opt/homebrew/bin が先にある場合は rc 内で PATH を組み直して shim を先頭に置く。

3. バージョンの存在を確認

pyenv versions
# 不足していれば
pyenv install 3.12.3
pyenv local 3.12.3
python --version

pyenv local.python-version を作るだけで、対象バージョンが入っていないと反映されない。
リポジトリの README は pyenv/pyenv にある。

4. PYENV_VERSION の解除

echo $PYENV_VERSION
unset PYENV_VERSION

環境変数が設定されていると、.python-version より優先される。
CI スクリプトでは終わったら unset しておく。

5. shim の再生成

pyenv rehash

新しいパッケージをインストールしたのに pip install の実行ファイルが見つからない時は rehash で shim を作り直す。

この記事は役立ちましたか?