CUBE SUGAR CONTAINER

技術系のこと書きます。

pyenv を使って Ubuntu に複数バージョンの Python をインストールする

今回は Python のインストールマネージャである pyenv を使って、簡単に複数のバージョンの Python を Ubuntu にインストールする方法を書く。 Python でソフトウェアを開発する際には、バージョン間の差異に配慮する必要がある。 そのため、開発する環境で使う Python のバージョンと実行する環境で使う Python のバージョンは、最低でもマイナーバージョンまでは揃えて開発することが望ましい。 そんなとき、開発ターゲットが色々とあるようなときはインストールマネージャが便利に使える。

使った環境は次のとおり。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04 LTS
Release:    22.04
Codename:   jammy
$ uname -srm
Linux 5.15.0-41-generic aarch64
$ pyenv --version
pyenv 2.3.2

もくじ

pyenv をインストールする

pyenv のインストール方法はいくつかあるけど、今だと pyenv-installer のスクリプトを使うのが一番ラクそう。

$ curl https://pyenv.run | bash

インストールできたら、表示に沿って必要な設定をシェルに追加する。

$ cat << 'EOF' >> ~/.bashrc
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
EOF
$ exec "$SHELL"

これで pyenv コマンドが使えるようになる。

$ pyenv --version
pyenv 2.3.2

あとは必要に応じて update しておこう。

$ pyenv update

pyenv で Python をビルドする

続いて pyenv を使って Python をビルドする。

ただし、その前に Python のビルドに必要となるパッケージをインストールする必要がある。 必要なパッケージは pyenv の wiki に記載がある。

github.com

上記を参照して必要なパッケージをインストールする。

$ sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

あとは pyenv install コマンドを使って特定のバージョンの Python をビルドできる。

$ pyenv install <version>

今回はシステムの Python が 3.10 系になっている。

$ python3 -V
Python 3.10.4

そのため、例としては Python 3.9 系をビルドしてみよう。 現時点 (2022-07) での最新版である 3.9.13 を指定する。

$ pyenv install 3.9.13

なお、デフォルトではビルドの際のログが最低限しか残らない。 そのため、必要に応じて -v オプションをつけると良い。 テキストファイルにログを残したいときは tee(1) と組み合わせて次のようにする。

$ pyenv install -v 3.9.13 2>&1 | tee build.log

で、ログを確認してみると、実は先述の wiki のパッケージだけだとビルドされない Optional なモジュールがあることが分かる。

$ grep -A 3 "The necessary bits to build these optional modules were not found:" build.log 
The necessary bits to build these optional modules were not found:
_dbm                  _gdbm                                    
To find the necessary bits, look in setup.py in detect_modules() for the module's name.

もし気になるようならビルドに必要なパッケージをインストールし直した上で、再度ビルドすれば良い。

$ sudo apt-get install libgdbm-dev libdb-dev
$ pyenv uninstall -f 3.9.13
pyenv: 3.9.13 uninstalled
$ pyenv install -v 3.9.13 2>&1 | tee build.log

最後に、pyenv で使用する Python のバージョンを ~/.pyenv/version に記載する。 この中で system はシステムにインストールされているデフォルトのバージョンを指す。 複数のパッチバージョンなどをインストールしているときは、ここで使うものを指定できる。

$ cat << 'EOF' > ~/.pyenv/version
system
3.9.13
EOF

これで、python3.9 が実行できるようになった。

$ python3.9 -V
Python 3.9.13

もちろん、先ほど ~/.pyenv/version に書いた通り、システムの Python も引き続き使うことができる。

$ python3 -V
Python 3.10.4

同様のやり方で複数のバージョンの Python をインストールできる。 ちなみに、Miniforge など Conda 系の実装も pyenv からインストールできるので便利。

いじょう。

まとめ

今回は pyenv を使って複数のバージョンの Python を Ubuntu にインストールする方法を紹介した。 なお、pyenv は Ubuntu だけでなく macOS など、色々な Unix 系の OS で利用できる。

また、Python の仮想環境の機能は pyenv の本体には組み込まれていない。 そのため pyenv-virtualenv プラグインを入れたり、自分で venv や virtualenv と組み合わせる必要がある。

blog.amedama.jp