CentOS 7 や Amazon Linux 2 でのPython環境の構築

Python

CentOS 7 は 2024年6月30日にサポート終了を迎えます。しかし、後継となる CentOS 8 のサポートが 2021 年末で終了してしまったことから、まだ CentOS 7 をお使いの方も多いのではないでしょうか。CentOS 7 は最初のバージョンが 2014年にリリースされた古い OS です。このため、最近のソフトウェアを利用するには少し工夫が必要になることがあります。

今回は、CentOS 7 や、CentOS 7 と互換性の高い Red Hat Enterprise Linux 7、Amazon Linux 2 で最新の Python 環境を構築する方法をまとめてみました。(2023年2月18日更新)

CentOS 7 等で利用可能な Python 環境の比較

CentOS 7 系で Python をインストールする方法は下の表で示すように複数あります。新しいバージョンの Python をビルドして使うのがオススメです。

インストール方法Pythonのバージョン備考
標準リポジトリ (python)2.7.5サポート終了済 (※1)
標準リポジトリ (python3)3.6.8サポート終了済 (※1)
Amazon Linux 2の標準リポジトリ (python3)3.7.16
Amazon Linux 2のExtras library (python3.8)3.8.16
Software Collections (rh-python36)3.6.12サポート終了済
Software Collections (rh-python38)3.8.13
ソースをビルド任意のバージョンpyenv を使うと簡単
2023年2月18日時点での各インストール方法によりインストールされるPythonのバージョン。
※1: Upstreamによるサポートは終了しましたが、Red Hat によるセキュリティフィックスのバックポートは行われます。(参考)

CentOS 7 系の最終バージョンである CentOS 7.9 で標準で提供される Python のバージョンは 2.7 と3.6 です。既にサポートは終了しているバージョンで(※1)、サードパーティーのライブラリやフレームワークにも対応しないものが増えてきています。もはや使うべきではありません。

Red Hat Software Collections (SCL) や Amazon Linux 2 の Extras library では Python 3.8 が提供されます。これらは簡単に使い始められるのがメリットです。しかし、Python 3.8は既にバグ修正は終了しており、今後はセキュリティ修正のみ行われます。このため、Python 3.8 を今から新規に使い始めるのはおすすめしません。

Pythonをソースから自分でビルドすれば、任意のバージョンの Python を利用することができます。さらに、pyenv を用いることで、ソースの取得・ビルド・インストール・環境の切り替えを自動的に行ってくれます。

準備 (CentOS7, Red Hat Enterprise Linux 7 の場合)

まず、ビルドに必要な環境を整えます。

Python 3.10 からは OpenSSL 1.1.1 が必要になったので、openssl11openssl11-devel パッケージをインストールする必要があります。

CentOS 7・Red Hat Enterprise Linux 7 では openssl11openssl11-devel パッケージのインストールに EPEL リポジトリを用います。EPEL が使えることを確認します。

# EPELが使えるか確認 ("disabled" または "無効" になっていてもOK)
sudo yum repolist all
# (略)
# epel/x86_64    Extra Packages for Enterprise Linux 7 - x86_64    enabled: 13754
# (略)

# CentOS 7 で EPELを使えるようにする
sudo yum install epel-release

# Red Hat Enterprise Linux 7 で EPEL を使えるようにする
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

必要なパッケージをインストールしていきます。

sudo yum groupinstall "development tools"
sudo yum install bzip2-devel gdbm-devel libffi-devel libuuid-devel ncurses-devel \
  openssl11 openssl11-devel readline-devel sqlite-devel xz-devel \
  zlib-devel tk-devel --enablerepo=epel

tk-devel パッケージは tkinter を使ったGUIアプリケーション(たとえばmatplotlib show()など)の実行に必要なものです。Python 3.11 ではライブラリの場所を自動的に見つけられなくなったので、 TCLTK_LIBS 環境変数で、ライブラリの場所を指定してやる必要があります(後述)。GUIアプリケーションを実行しない環境のサーバーなどの場合には tk-devel パッケージをインストールする必要はありません。

EPELからインストールした OpenSSL 1.1.1 は、標準の場所と異なる場所にインストールされるため、Python のビルドがうまくいきません。このため、シンボリックリンクを張ります

sudo mkdir /usr/local/openssl11
sudo ln -s /usr/lib64/openssl11 /usr/local/openssl11/lib
sudo ln -s /usr/include/openssl11 /usr/local/openssl11/include

Python のビルドに pyenv を用いる場合、ビルドシステムが OpenSSL のヘッダ・ライブラリを見つけられるように、PYTHON_CONFIGURE_OPTS 環境変数でOpenSSLの場所を指定します。また、Python 3.11 で tkinter を使う場合は Tcl/Tk のライブラリの場所を TCLTK_LIBS 環境変数で指定します。

# BASHの場合
echo 'export PYTHON_CONFIGURE_OPTS="--with-openssl=/usr/local/openssl11"' >> ~/.bashrc
echo 'export TCLTK_LIBS="-L/usr/lib64 -ltcl8.5 -ltk8.5"' >> ~/.bashrc

# ZSHの場合
echo 'export PYTHON_CONFIGURE_OPTS="--with-openssl=/usr/local/openssl11"' >> ~/.zshrc
echo 'export TCLTK_LIBS="-L/usr/lib64 -ltcl8.5 -ltk8.5"' >> ~/.zshrc

# BASH・ZSH共通 (設定を反映させる)
exec "$SHELL"

この他、--enable-optimizations (PGO; Profile Guided Optimization による最適化を行う) や --enable-shared (ダイナミックリンク用のshare objectを生成する) なども PYTHON_CONFIGURE_OPTS 環境変数で設定できます。

準備 (Amazon Linux 2 の場合)

Amazon Linux 2 では openssl11-devel と、旧バージョンの openssl-devel は共存できないので、もしインストールされている場合にはあらかじめアンインストールしておきます。

sudo yum remove openssl-devel

Amazon Linux 2 では openssl11openssl11-devel パッケージは標準リポジトリからインストールできるため、EPEL は不要です。

必要なパッケージをインストールしていきます。

sudo yum groupinstall "development tools"
sudo yum install bzip2-devel gdbm-devel libffi-devel libuuid-devel ncurses-devel \
  openssl11 openssl11-devel readline-devel sqlite-devel xz-devel \
  zlib-devel tk-devel

tk-devel パッケージは tkinter を使ったGUIアプリケーション(たとえばmatplotlib show()など)の実行に必要なものです。Python 3.11 ではライブラリの場所を自動的に見つけられなくなったので、 TCLTK_LIBS 環境変数で、ライブラリの場所を指定してやる必要があります(後述)。GUIアプリケーションを実行しない環境のサーバーなどの場合には tk-devel パッケージをインストールする必要はありません。

Amazon Linux 2 の OpenSSL 1.1.1 は標準的な場所(/usr/lib64/)にインストールされるため、シンボリックリンクを張ったり、PYTHON_CONFIGURE_OPTS 環境変数でOpenSSLの場所を指定する必要はありません。

Python 3.11 で Tkinter を用いる場合は、Tcl/Tk のライブラリの場所を TCLTK_LIBS 環境変数で指定します。

# BASHの場合
echo 'export TCLTK_LIBS="-L/usr/lib64 -ltcl8.5 -ltk8.5"' >> ~/.bashrc

# ZSHの場合
echo 'export TCLTK_LIBS="-L/usr/lib64 -ltcl8.5 -ltk8.5"' >> ~/.zshrc

# BASH・ZSH共通 (設定を反映させる)
exec "$SHELL"

Python をビルドする

必要なパッケージのインストールが終われば、あとは Python をビルドすればOKです。公式サイトから必要なバージョンの source tarball をダウンロードします。

Python Source Releases for Source release
The official home of the Python Programming Language

ダウンロードしたファイルを展開してビルドします。configure スクリプトの prefix オプションでインストール先のディレクトリを指定します。また、CentOS7、Red Hat Enterprise Linux 7 の場合は、with-openssl オプションで OpenSSL の場所を指定します。

tar xf Python-3.x.y.tar.xz
cd Python-3.x.y

# Python 3.11 で tkinter を使う場合は Tcl/Tk のライブラリの場所を TCLTK_LIBS 環境変数で指定する必要がある
export TCLTK_LIBS="-L/usr/lib64 -ltcl8.5 -ltk8.5"

# CentOS7, Red Hat Enterprise Linux 7 の場合
./configure --prefix=$HOME/.local/python-3.x.y --with-openssl=/usr/local/openssl11

# Amazon Linux 2 の場合
./configure --prefix=$HOME/.local/python-3.x.y

make
make install

これで、~/.local/python-3.x.y/bin/python3 で Python を実行できるようになりました。PATH環境変数を設定することで簡単に使えるようになります。PATH環境変数に設定する値は、実際のパスに合わせてください。また、

# BASHの場合
echo 'export PATH="$HOME/.local/python-3.x.y/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="$HOME/.local/python-3.x.y/bin:$PATH"' >> ~/.bash_profile

# ZSHの場合
echo 'export PATH="$HOME/.local/python-3.x.y/bin:$PATH"' >> ~/.zshrc

シェルを再起動することで、python3 とするだけで Python を使えるようになります。

exec "$SHELL"

また、pyenv に含まれる python-build スクリプトをスタンドアロンで使うと、ソースコードのダウンロードからビルドまでコマンド1つで完了して便利です。CentOS7、Red Hat Enterprise Linux 7 でpython-build スクリプトを使う場合、あらかじめ PYTHON_CONFIGURE_OPTS 環境変数でOpenSSLの場所を指定しておく必要があります。

まず、次のようにして pyenv をインストールします。~/.pyenv 以下にインストールされます。

curl https://pyenv.run | bash

次の例では、python-build を用いて、Python 3.10.10 を ~/.local/python-3.10.10 にインストールします。

~/.pyenv/plugins/python-build/bin/python-build 3.10.10 ~/.local/python-3.10.10

ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib? というエラーが表示されビルドに失敗するときは、PYTHON_CONFIGURE_OPTS 環境変数でOpenSSLの場所が正しく設定されているかを確認してください。

pyenv を用いてPythonをビルドする

pyenv を用いると、複数のバージョンの Python を簡単にビルド・インストールし、使い分けることができます。ただし、複数のバージョンの Python を切り替えて使う必要がない場合には pyenv はオーバースペックです。OSやシェルの知識がないと、トラブル発生時の対応も難しいので、初心者にはあまりお勧めできません。

まず、次のようにして pyenv をインストールします。~/.pyenv 以下にインストールされます。

curl https://pyenv.run | bash

次に、pyenv のために環境変数を設定します。BASHの場合の最後の3行では、~/.bash_profile に設定を書き込んでいますが、もし~/.bash_profile~/.bash_login の両方が存在しない場合には、~/.bash_profile のかわりに ~/.profile に書き込んでください。もし、~/.bash_profile が存在せず、~/.bash_login が存在する場合には、~/.bash_profile のかわりに ~/.bash_login に書き込んでください。bash の設定ファイルの優先順位は ~/.bash_profile~/.bash_login~/.profile の順になっているためです 。

# BASHの場合
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

# ZSHの場合
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc

最後に、シェルを再起動することで、pyenv のセットアップは完了です。

exec "$SHELL"

pyenv のセットアップが完了したら、Python をインストールします。

インストール可能なバージョンの一覧を表示します。

pyenv install --list
# Available versions:
#   2.1.3
#   2.2.3
#   (略)
#   3.10.8
#   3.10.9
#   3.10.10
#   3.11.0
#   3.11-dev
#   3.11.1
#   3.11.2
#   (略)

例えば、Python 3.10.10 をインストールするには次のようにします。Tab キーでサブコマンドやバージョン番号の補完入力もできます。この方法でインストールすると、Python は ~/.pyenv/versions/ 以下にインストールされます。同様にして、Anaconda や Miniconda もインストールできます。

pyenv install 3.10.10
# Downloading Python-3.10.10.tar.xz...
# -> https://www.python.org/ftp/python/3.10.10/Python-3.10.10.tar.xz
# Installing Python-3.10.10...
# Installed Python-3.10.10 to /home/ec2-user/.pyenv/versions/3.10.10

pyenv versions で、インストールされている Python の一覧を表示します。

pyenv versions
# * system (set by /home/ec2-user/.pyenv/version)
#   3.10.10

Python のバージョンを切り替えます。全てのディレクトリで切り替える pyenv global と、特定のディレクトリ以下でのみ切り替える pyenv local があります。

pyenv global 3.10.10
pyenv local 3.10.10

次の例ではディレクトリ test の中で pyenv local を行うことで、ディレクトリ test の中だけで指定したバージョンのPython が使われることを示します。プロジェクトごとに異なるバージョンの Python を使う場合に便利です。

mkdir test && cd test
python -V
# Python 2.7.18
pyenv local 3.10.10
python -V
# Python 3.10.10
cd ..
python -V
# Python 2.7.18

pyenv local で指定したバージョンは、各ディレクトリの .python-version というファイルに記録されています。

pyenv-virtualenv

pyenv を利用することで、異なる複数のバージョンの Python をインストールし、使い分けることができるようになりました。さらに、virtualenv プラグインを利用することで、同じバージョンの Python 環境を複数作成することができるようになります。利用するパッケージをプロジェクトごとに変えたい場合などで便利です。上記の手順 (https://pyenv.run のインストールスクリプトを利用) で pyenv をインストールした場合には、virtualenv プラグインも既にインストールされています。

testenv という名前で Python 3.10.10 の仮想環境を作成します。バージョンを省略した場合には、現在のディレクトリで有効になっている Python が用いられます。

pyenv virtualenv 3.10.10 testenv

仮想環境の一覧を表示します。

pyenv virtualenvs
# 3.10.10/envs/testenv (created from /home/ec2-user/.pyenv/versions/3.10.10)
# testenv (created from /home/ec2-user/.pyenv/versions/3.10.10)

仮想環境に切り替えます。警告メッセージを表示しないようにしたい場合には、~/.bashrc 等に export PYENV_VIRTUALENV_DISABLE_PROMPT=1 を加えておきます。

pyenv activate testenv
# pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
# (testenv) $

仮想環境から脱出し、元の環境に戻ります。

pyenv deactivate

不要になった仮想環境を削除します。

pyenv uninstall testenv

pyenv local を用いることで特定のディレクトリ内だけで、指定した仮想環境を有効にすることもできます。

pyenv local testenv

PythonでFX分析や取引を始めるための入門書としては、Pythonによるファイナンス 第2版がオススメです。

本サイトの内容は、投資の勧誘を目的としたものではなく、本サイト内の情報に基づいて行った取引の損失について、本サイトは一切の責を負いかねます。当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。免責事項もご覧ください。

Python

コメント

タイトルとURLをコピーしました