pyenvでPythonのバージョン管理をする方法

Python

こんにちは、かつコーチです。

「PCに元からPythonが入っているのに、なぜわざわざpyenvを使うの?」と聞かれることがよくあります。
実はこれ、私自身が初心者の頃につまずいたポイントでもあります。
この記事では、pyenvとは何か、なぜ必要なのか、インストールから使い方までを解説します。

pyenvとは?

複数のPythonバージョンを切り替えるツール

pyenv(パイエンブ)とは、1台のPCの中で複数のPythonバージョンを管理し、自由に切り替えられるツールです。
PCには標準でPythonが入っていることが多いですが、これはシステムPythonと呼ばれます。
システムPythonはOSの一部の機能が依存していることがあり、バージョンを変えると不具合の原因になります。

なぜバージョン管理が必要なのか

プロジェクトによって、必要なPythonのバージョンは異なります。
古いプロジェクトはPython 3.9、新しいプロジェクトはPython 3.12を要求する、ということもよくあります。
1つのPythonしか使えないと、プロジェクトごとに環境が衝突してしまいます。
pyenvを使えば、プロジェクトごとに使うバージョンを切り替えられます。
これにより「あるプロジェクトでは動くのに、別のプロジェクトでは動かない」というトラブルを防げます。

pyenvのインストールと使い方

手順1:Homebrewでpyenvをインストールする(macOS)

macOSの場合、Homebrew(パッケージ管理ツール)を使うのが最も簡単です。

brew update
brew install pyenv

手順2:シェルの設定ファイルにパスを通す

インストール後、ターミナルの起動時にpyenvが読み込まれるよう設定します。
zshを使っている場合は~/.zshrcに以下を追記します。

echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc

手順3:Pythonをインストールする

インストール可能なバージョン一覧は以下で確認できます。

pyenv install --list

任意のバージョンをインストールします。

pyenv install 3.12.4

手順4:バージョンを切り替える

インストールしたバージョンを、システム全体で使うか、特定のディレクトリだけで使うかを選べます。

# システム全体でこのバージョンを使う
pyenv global 3.12.4

# 現在のディレクトリだけでこのバージョンを使う
pyenv local 3.12.4

pyenv localを実行すると、そのディレクトリに.python-versionというファイルが作られます。
このファイルがあるディレクトリでは、自動的に指定したバージョンが使われます。

よくあるつまずきポイント:バージョンが切り替わらない

Before:pyenv installしたのに反映されない

私が最初にpyenvを使ったとき、インストールしたはずのバージョンが反映されず困りました。

$ pyenv global 3.12.4
$ python --version
Python 3.9.6

新しいバージョンを指定したのに、古いシステムのPythonが表示されてしまう状態です。
原因は、シェルの設定ファイルにpyenv initの記述が正しく反映されていなかったことでした。

After:シェルの設定を見直して解決

# .zshrcに設定が入っているか確認
cat ~/.zshrc | grep pyenv

# 設定を再読み込みする
source ~/.zshrc

# バージョンを再確認
python --version
# => Python 3.12.4

設定ファイルを保存した後は、必ずターミナルを再起動するかsourceコマンドで再読み込みしてください。
これを忘れると、変更前のPythonが使われ続けてしまいます。

まとめ

この記事のポイント

  • pyenvは1台のPCで複数のPythonバージョンを管理できるツールである
  • プロジェクトごとにバージョンを分けることで環境の衝突を防げる
  • pyenv localで設定したバージョンは、そのディレクトリ内で自動的に有効になる
  • 設定変更後は必ずシェルを再読み込みする

次に読むべき記事

Pythonのバージョンを用意できたら、次はプロジェクトごとの仮想環境を整えましょう。
「venvで仮想環境を作る方法:なぜ仮想環境が必要か」で詳しく解説しています。

タグ: Python, 初心者向け, 環境構築

タイトルとURLをコピーしました