📚

システムワイドに利用するPythonをpyenv同梱のpython-buildコマンドでインストールする

に公開

はじめに

Linux環境で特定のPythonバージョンをサーバー全体(全ユーザー)で利用したい場合、パッケージマネージャーでは対応していないバージョンを使わざるを得ないケースがあります。

このような場合、通常はPythonの公式サイトからソースコードをダウンロードし、makeコマンドなどを使ってビルドする必要があります。
しかし、ビルドに必要な依存パッケージの準備や設定は意外と手間がかかるものです。

ここでは複数のPythonバージョンを管理するために導入するpyenvに同梱されているpython-buildコマンドを活用して、システムワイドなPython環境を構築する方法について記載します。

対象となる環境・状況

以下のような環境や状況を想定しています:

  • Linux系OS環境(CentOS、RHEL、Ubuntu等)
  • dnfやaptなどのパッケージマネージャーでは必要なPythonバージョンがインストールできない
  • サーバー内の全ユーザーで特定のPythonバージョンを利用したい
  • ソースコードからビルドする必要がある

手順の概要

大まかな流れは以下のようになります:

  1. pyenvをインストールしてpython-buildコマンドを利用可能にする
  2. python-buildでPythonのソースコードをダウンロード・ビルドする
  3. 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