pyenvで複数バージョンをサクッと切り替える

複数のバージョンのPythonを使いたいときはありませんか?ありますよね?そう,あるんですよ!そんな要望に応えてくれるのがpyenvです.ということで,pyenvの導入方法のメモです.巷には環境分離ツールがあふれかえっていますが個人的にはpyenvで複数バージョンを管理してvenvでパッケージ環境を切りわけるような使い方がもっともシンプルであらゆるニーズに対応できるのではないかと思っています.

わたしはpyenvが必要ですか?

複数のバージョンのpythonを使いたければyes,それ以外はnoかと.

pyenvはバージョン間での動作検証したりとか,わりとがっつりコード書く人には向いてますがライトユーザには向いてない印象です.Pythonが動けばバージョンとか気にしないよ!って人であればpyenvは不要.内部でPATHをごにょごにょしているのでライトユーザ層にとってはPATHまわりがはまりポイントになりそうで,自己解決困難となることが容易に想像できます.使わない方が吉でしょう.

pyenv の導入

pyenvはgithubで開発されています.ここに書いてある通りにやっていきます.以下、2022/3/13 時点でのLinuxへの導入方法です.変更される可能性があるのでご注意ください.いや,まじでこんなの読むよりオフィシャル読んだほうがいいです.

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
cd ~/.pyenv && src/configure && make -C src

以下,~/.profile~/.bashrc があるディストリビューション(たぶんDebian系はこれ)の説明になります.

~/.profile を編集します.最初の2行と最後の1行を追加.

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

eval "$(pyenv init --path)"

次に ~/.bashrcを編集します.最後の行に追加.

eval "$(pyenv init -)"

~/.profile を読み込みます.

source ~/.profile
pyenv --version
pyenv 2.2.4-1-10-g0d949796

OK.

pyenv の使い方

特定のバージョンをインストール

pyenv install -l でインストール可能なリストが表示されるので,pyenv install (version) でインストールすればOKです.

pyenv install 3.10.2

ちなみにインストール候補はtab補完が効きます.

WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib? のようなWARNINGが出る場合,メッセージの内容にあわせてこのあたりのパッケージが必要かもしれません.

sudo apt-get install libbz2-dev libreadline-dev libsqlite3-dev

特定のバージョンを指定フォルダ以下で使用する

とあるプロジェクトで特定のバージョンのPythonを使いたい場合,そのフォルダに移動してpyenvコマンドを使用します.例えば,プロジェクト hoge で 3.10.2 を使いたい場合

pyenv local 3.10.2

とすればOKです.

ユーザがデフォルトで使用するPythonのバージョンを指定する

そのユーザが何も考えずにPythonを使用した時に動作するバージョンを指定します.

pyenv global 3.7.12

今有効なバージョンを確認&インストールされているバージョンを確認

pyenv versions
  system
* 3.10.2 (set by /hoge/fuga/piyo/.python-version)
  3.7.12

新しいPythonがリリースされたので試してみたい

新しいPythonがリリースされるとpyenvが更新されます.ちゃんと確認したことはないです更新までのタイムラグはかなり短そうです.

cd ~/.pyenv
git pull