pyenv で Python のバージョンが切り替わらない
pyenv local や pyenv global を実行しても python --version が変わらない時は、shim より前にシステム Python が PATH 解決されているか、shell の rc に pyenv init が書かれていないことが多い。
rc と PATH を見直す。
公開:
要約
pyenv は $PYENV_ROOT/shims 配下に python などのラッパースクリプトを置き、それを PATH の先頭に挿入することで python 呼び出しを横取りする。
shim パスが PATH に入っていない、または OS の python が先に解決されていると、pyenv local を打っても効かない。pyenv init を rc に書いて shell を再起動するのが基本対応。
よくある原因
eval "$(pyenv init - bash)"を rc に書き忘れている、または zsh に乗り換えた際に.zshrc側に転記していないwhich pythonが/usr/bin/python3や/opt/homebrew/bin/python3を返しており、shim が PATH の後ろに居る.python-versionが書き込まれたディレクトリでもpyenv versionsに該当版が無く、グローバルバージョンにフォールバックしている- CI で
PYENV_VERSIONを設定したまま消し忘れている - 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 -5shim パスが上位に来ているか確認する。/usr/local/bin や /opt/homebrew/bin が先にある場合は rc 内で PATH を組み直して shim を先頭に置く。
3. バージョンの存在を確認
pyenv versions
# 不足していれば
pyenv install 3.12.3
pyenv local 3.12.3
python --versionpyenv 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 を作り直す。