システムワイドに利用するPythonをpyenv同梱のpython-buildコマンドでインストールする
はじめに
Linux環境で特定のPythonバージョンをサーバー全体(全ユーザー)で利用したい場合、パッケージマネージャーでは対応していないバージョンを使わざるを得ないケースがあります。
このような場合、通常はPythonの公式サイトからソースコードをダウンロードし、makeコマンドなどを使ってビルドする必要があります。
しかし、ビルドに必要な依存パッケージの準備や設定は意外と手間がかかるものです。
ここでは複数のPythonバージョンを管理するために導入するpyenvに同梱されているpython-build
コマンドを活用して、システムワイドなPython環境を構築する方法について記載します。
対象となる環境・状況
以下のような環境や状況を想定しています:
- Linux系OS環境(CentOS、RHEL、Ubuntu等)
- dnfやaptなどのパッケージマネージャーでは必要なPythonバージョンがインストールできない
- サーバー内の全ユーザーで特定のPythonバージョンを利用したい
- ソースコードからビルドする必要がある
手順の概要
大まかな流れは以下のようになります:
- pyenvをインストールして
python-build
コマンドを利用可能にする -
python-build
でPythonのソースコードをダウンロード・ビルドする -
update-alternatives
でシステムデフォルトのPythonを設定する
本記事では、Python 3.9.23を例に手順を説明していきます。実際にインストールしたいバージョンに応じて、適宜読み替えてください。
それでは、順番に見ていきましょう。
pyenvのインストール
まず、pyenvをインストールします。pyenvに同梱されているpython-build
コマンドを利用するのが目的です。
インストールコマンドの実行
pyenv/pyenv: Simple Python version management を参照し、以下のコマンドでpyenvをインストールします。
curl -fsSL https://pyenv.run | bash
環境変数の設定
pyenvを使用するための環境変数を設定します。必要に応じて以下のコマンドで、.bashrc
や.bash_profile
に必要な設定を追加します。
# .bashrcへの追加
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init - bash)"' >> ~/.bashrc
# .bash_profileへの追加
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init - bash)"' >> ~/.bash_profile
設定を反映させるため、シェルを再起動します。
exec "$SHELL"
ビルドに必要な依存パッケージのインストール
Pythonをソースコードからビルドするために必要なパッケージをインストールします。
以下はCentOS/RHEL系での例です:
yum install gcc make patch zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl11-devel tk-devel libffi-devel xz-devel
python-buildコマンドでPythonをビルド・インストール
pyenvが正常にインストールされたら、同梱されているpython-build
コマンドを使ってPythonをビルドします。
cd ~
sudo .pyenv/plugins/python-build/bin/python-build 3.9.23 /opt/python/3.9.23
このコマンドの各部分を説明すると:
-
.pyenv/plugins/python-build/bin/python-build
: pyenvに同梱されているpython-buildコマンド -
3.9.23
: インストールしたいPythonのバージョン -
/opt/python/3.9.23
: インストール先のディレクトリ
ビルドには時間がかかりますので、完了まで待ちます。
update-alternativesでシステムデフォルトの設定
最後に、システムがデフォルトで使用するPythonバージョンを設定します。
update-alternativesコマンドとは
update-alternatives
は、同じ機能を持つ複数のプログラムやバージョンがシステムに存在する場合に、どれを優先的に使用するかを管理するLinuxのコマンドです。
具体的には以下のような機能を提供します:
- 代替プログラムの管理: 同じ名前のコマンドで異なるバージョンやパッケージを切り替え可能
- シンボリックリンクによる制御: 実際の実行ファイルへのシンボリックリンクを自動で管理
- 優先度による自動選択: 各代替プログラムに優先度を設定し、最も高い優先度のものを自動選択
- 手動での切り替え: 必要に応じて手動で使用するプログラムを変更可能
今回のケースでは、システム標準のPython(例:python3.7
)と新しくビルドしたPython(例:python3.9
)の両方を登録し、優先度を設定することで、python3
コマンド実行時にどちらを使用するかを制御します。
設定の実行
update-alternatives
コマンドを使って、複数のPythonバージョンを管理できるようにします。
# 既存のpython3を登録(優先度10)
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 10
# 新しくビルドしたpython3を登録(優先度20、より高い)
sudo update-alternatives --install /usr/bin/python3 python3 /opt/python/3.9.23/bin/python3.9 20
# 優先度が高いものを自動で使用するように設定
sudo update-alternatives --auto python3
# 設定の確認
sudo update-alternatives --list python3
コマンドの詳細説明
update-alternatives
コマンドの形式は以下の通りです:
update-alternatives --install <link> <name> <path> <priority>
-
<link>
: シンボリックリンクを作成する場所(/usr/bin/python3
) -
<name>
: alternatives名(python3
) -
<path>
: 実際の実行ファイルのパス -
<priority>
: 優先度(数字が大きいほど優先される)
上記の設定により、python3
コマンドを実行すると優先度の高い(数字の大きい)バージョンが使用されます。
動作確認
設定が完了したら、実際にPythonのバージョンを確認してみましょう。
python3 --version
期待通りのバージョン(この例では3.9.23)が表示されれば成功です。
まとめ
本記事では、pyenvに同梱されているpython-build
コマンドを使って、システムワイドで利用するPythonをソースコードからビルド・インストールする方法について記述しました。
この方法の利点は以下の通りです:
- パッケージマネージャーで提供されていないPythonバージョンを利用できる
- サーバー内の全ユーザーで統一したPythonバージョンを使用できる
-
update-alternatives
により、複数バージョンの管理が容易
一方で、ソースコードからのビルドには時間がかかることや、依存パッケージの管理が必要な点は留意しておく必要があります。
参考になれば幸いです。
Discussion