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 を使うと簡単 |
※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 が必要になったので、openssl11
と openssl11-devel
パッケージをインストールする必要があります。
CentOS 7・Red Hat Enterprise Linux 7 では openssl11
と openssl11-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 では openssl11
と openssl11-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 をダウンロードします。
ダウンロードしたファイルを展開してビルドします。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版がオススメです。
コメント