【Python】pyenv で複数バージョンを管理する (チートシート付)【Ubuntu】
はじめに
サードパーティ製のパッケージだけでなく、プログラミング言語自体も日々のアップデートによって頻繁にバージョンアップが行われており、継続的なアプリ開発を行っていく上では、アプリ毎に使用する言語やパッケージのバージョンを管理する必要が出てきます。
最近、 WSL 2 を使用して Ubuntu で Python の開発環境を構築した際に、複数の Python のバージョンを管理するために pyenv を導入したので、インストール方法と使い方についてまとめてみました。
おまけとして、主に使用する pyenv コマンドをチートシートとして合わせてまとめています。
動作環境
OS | Version |
---|---|
Ubuntu | 20.04 LTS |
※ Windows 10 Pro の Windows Subsystem for Linux (WSL 2) を使用
Application | Version |
---|---|
Git | 2.25.1 |
pyenv | 1.2.21 |
pyenv のインストール
pyenv のソースコードを GitHub から clone して .bashrc
へ必要な情報を追記するだけで、 pyenv のインストールは完了します。
詳細は GitHub の pyenv 公式の README.md に書いてあるので、こちらを見た方が間違いないです。
以下は pyenv 公式のインストール手順を参考に、実際に Ubuntu の環境へインストールした手順になります。
1. pyenv のソースコードを clone する
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
ユーザのホームディレクトリ直下に、 GitHub のリポジトリから pyenv のソースコードを clone します。
2. 環境変数を定義する
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
環境変数 PYENV_ROOT
へ先程 clone した .pyenv
ディレクトリのパスを定義し、次に環境変数 PATH
へ .pyenv/bin
を追加する処理を、ユーザのホームディレクトリ直下にある .bashrc
へ追記します。
3. pyenv 初期化処理を .bashrc へ追記する
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
pyenv init -
では、 pyenv に必要な環境変数の定義や初期化処理が実行されます。
実際の処理の内容は、 echo "$(pyenv init -)"
で確認できます。
4. Bash (シェル) を再起動する
exec "$SHELL"
.bashrc
に必要な処理をすべて書いているので、 source ~/.bashrc
でも大丈夫のような気がしますが、 pyenv 公式のインストール手順には上記スクリプトが書いてあるので、素直に Bash を再起動します。
正確には、新たなシェルを起動して自分自身と置き換える、でしょうか?
これで pyenv のインストールは完了です。
pyenv の使い方
pyenv
コマンドを使用して、 Python のインストールや python
コマンドで実行される Python のバージョンの設定を行います。
Python のインストール
# Python のバージョン 3.9.0 をインストール pyenv install 3.9.0
インストールしたい Python のバージョンを指定して、 pyenv install
コマンドを実行します。
pyenv でインストール可能な Python のバージョンは、 pyenv install --list
で確認することができます。
【エラー発生時】Ubuntu に不足するパッケージを追加
pyenv で Python をインストールする際、パッケージが不足していると Python のビルドでエラーが発生するか、インストールに成功しても一部のモジュールが使用できない場合があります。
今回使用した環境は WSL 2 上のまっさらな Ubuntu 20.04 LTS ですが、 pyenv のみインストールして Python 3.9.0 をインストールしたところ、ビルドエラーが発生しました。
pyenv の Python のインストールログは、 /tmp/
ディレクトリに python-build.yyyymmddhh24miss.fff.log
というファイル名で出力されます。
GitHub の pyenv 公式 Wiki に OS 毎の推奨ビルド環境が記載されているので、こちらを参考に必要なパッケージを追加しましょう。
僕の環境 (Ubuntu 20.04 LTS) では、以下のパッケージを追加することで、正常に Python をインストールできるようになりました。
sudo apt update sudo apt upgrade sudo apt install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev tk-dev libffi-dev liblzma-dev libgdbm-dev libdb-dev
Packages | Description |
---|---|
build-essential | gcc や make などのビルドパッケージ群 |
libssl-dev | Python 標準モジュールの依存パッケージ |
zlib1g-dev | Python 標準モジュールの依存パッケージ |
libbz2-dev | Python 標準モジュールの依存パッケージ |
libreadline-dev | Python 標準モジュールの依存パッケージ |
libsqlite3-dev | Python 標準モジュールの依存パッケージ |
tk-dev | Python 標準モジュールの依存パッケージ |
libffi-dev | Python 標準モジュールの依存パッケージ |
liblzma-dev | Python 標準モジュールの依存パッケージ |
libgdbm-dev | Python 標準モジュールの依存パッケージ |
libdb-dev | Python 標準モジュールの依存パッケージ |
Python のインストールは、正常に完了するまで何度でもリトライすることが可能です。
使用する Python のバージョン切替
# 現在のシェル固有の Python のバージョンを 3.9.0 に設定 pyenv shell 3.9.0 # カレントディレクトリ以下で固有の Python のバージョンを 3.9.0 に設定 pyenv local 3.9.0 # すべてのシェルで使用される Python のバージョンを 3.9.0 に設定 pyenv global 3.9.0
使用するコマンドにより、設定する Python のバージョンの有効範囲が変わります。
複数の設定が存在する場合の優先順位は shell > local > global
となります。
現在設定されている Python のバージョンは、 pyenv version
コマンドで確認できます。
Python のアンインストール
# Python のバージョン 3.9.0 をアンインストール pyenv uninstall 3.9.0
不要になった Python のバージョンは、 pyenv uninstall
コマンドでアンインストールできます。
venv との組み合わせ
pyenv は Python 自体のバージョンを管理するものですが、これと合わせて Python 標準ライブラリの venv を利用することで、設定した Python のバージョンでパッケージを管理する仮想環境を作成することができます。
# Python のバージョンを設定 pyenv shell 3.9.0 # カレントディレクトリに仮想環境を作成 python -m venv --upgrade-deps venv # 仮想環境を有効化 source venv/bin/activate
この例では pyenv shell
コマンドを使用して現在のシェル固有の Python のバージョンを設定していますが、次回からは pyenv での Python の設定内容にかかわらず、仮想環境を有効化するだけで仮想環境作成時に設定したバージョンの Python が使用できます。
pyenv コマンドチートシート
Command | Description |
---|---|
pyenv install --list |
pyenv でインストール可能な Python のバージョンを一覧表示 |
pyenv install [version] |
指定したバージョンの Python をインストール |
pyenv versions |
pyenv でインストールした Python を一覧表示 |
pyenv shell [version] |
現在のシェルで使用する Python のバージョンを設定 |
pyenv local [version] |
カレントディレクトリ以下で使用する Python のバージョンを設定 |
pyenv global [version] |
すべてのシェルで使用する Python のバージョンを設定 |
pyenv version |
現在設定されている Python のバージョンを表示 |
pyenv uninstall [version] |
指定したバージョンの Python をアンインストール |
※ その他のコマンドや詳細は GitHub の pyenv 公式 Command Reference を参照
おわりに
pyenv を使用すれば一つの OS 上で複数の Python のバージョンを管理することができますが、アプリ開発環境という視点で見れば Python や Python パッケージのバージョンだけでなく、 Web サーバや DBMS などのミドルウェアのバージョンも管理する必要があります。
最近は WSL 2 によって Windows ユーザにも Docker が身近になりつつあるので、 今後は Web サーバや DBMS などのミドルウェアも合わせてコンテナ化し、一つのアプリ開発環境として管理するのが主流になるかもしれません。
とは言っても、手軽に Python のバージョン管理を行う際はやはり pyenv が有用なので、要件に合わせて使い分けするのがベターではないでしょうか。
ちなみに僕は今 Docker に興味津々なので、ある程度使えるようになったら、次は Docker のまとめエントリを書きたいと思っています (o´艸`)