🐵

サクッとpyhosn(Mac)

2024/10/28に公開

はじめに

  • Mac ユーザ (Apple Silicon)
  • Unity と C# 周辺のことしかやってこなかった
  • 使いたいツールごとに ptyhon の必須バージョンが違う
  • zsh ユーザ

前提

こちらを見て homebrew のインストールを終えていること

https://zenn.dev/gahuto/articles/9b39b0058f3852

インストール

1.pyenv のインストール

ターミナルを立ち上げて pyenv をインストール

# インストール
brew install pyenv

# インストーつが成功しているか確認
pyenv -v

/Users/{​​​​​​user name}​​​​​​/.zshrc を開く (なければ新規作成)
次の3行を追加

# pyenv の設定
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

2.Pythonのインストール

大抵必要されるケースが 2.7.x系 と 3.1.x系だと思われる
それらをインストールする

# インストール可能なバージョンの一覧をあらかじめみておく
pyenv install --list

# 2.7系の安定バージョンをインストール
pyenv install 2.7 

# 3.12.7をインストール (マイナーバージョンまで指定)
pyenv install 3.12.7

動作確認

さっそく動作確認をしてみたが...

問題発生

インストールされているバージョンを確認

pyenv versions
* system (set by /Users/myname/.pyenv/version)
  2.7.18
  3.12.7

pyenv でバージョンを 2.7.18に切り替える

pyenv global 2.7.18

バージョンが切り替わったかを確認してみると...

python --version

system のものと思しきバージョンが出力された

Python 3.13.0

pyenv でバージョンを system にする、バージョンを確認すると...

pyenv global system
python --version

エラーが出た!!

pyenv: python: command not found

The `python' command exists in these Python versions:  2.7.18

Note: See 'pyenv help global' for tips on allowing both
      python2 and python3 to be found.

原因

推測になるが、恐らくこの2つが原因

  • system(Homebrew)の Python と pyenv の Python の参照優先順位が適切に設定されていない
  • python コマンドと python3 コマンドの扱いが明確に区別されていなかった

解決策

試行錯誤の結果 .zshrc を次のように改修した

  • Homebrew のパスの設定を pyenv/python の設定より前に行う
  • eval "$(pyenv init -)" で pyenv の初期化
  • switch_python() 関数を追加
    • system または Python 3.x の時は python を python3 にエイリアス
    • それ以外(Python 2.x)の時はエイリアスを解除
# Homebrew の設定
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:$PATH"


... (その他の設定) ...


# pyenv の設定
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

# Python のバージョン切り替え用の関数
switch_python() {
    current_version=$(pyenv version | cut -d' ' -f1)
    if [ "$current_version" = "system" ] || [[ "$current_version" =~ ^3\. ]]; then
        alias python="python3"
    else
        unalias python 2>/dev/null || true
    fi
}

# 初期実行
switch_python

# pyenvコマンド実行後のフック
autoload -U add-zsh-hook
add-zsh-hook precmd switch_python

成功!!

上記の改修で今回は上手くいった〜!

# system への切り替え
pyenv global system
python --version  # Python 3.13.0 が表示された!!

#  Python 2.7.18 への切り替え
pyenv global 2.7.18
python --version  # Python 2.7.18 が表示された!!

# Python 3.x への切り替え
pyenv global 3.12.7
python --version  # Python 3.12.7 が表示された!!

Discussion