centos7にてとあるパッケージのインストールにpython3.8以上が必要になったのですが、インストールや環境設定で気をつける部分が多かったので記録として。
version
# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
# python -V
Python 2.7.5
デフォルトではpython2.7がインストールされている
python3も標準リポジトリに存在するがyum install python3
などでインストールするとpython3.6.8になる
# yum list python3
Available Packages
python3.i686 3.6.8-19.el7_9 updates
python3.x86_64 3.6.8-19.el7_9 updates
python3.8のインストール
python3.8をインストールするため、SCLをリポジトリに登録してrh-python38
をインストールします
インストール後、scl enable
でpython3.8の有効化を行います
# yum install -y centos-release-scl
# yum install -y rh-python38
# scl enable rh-python38 bash
# python -V
Python 3.8.13
注意点
1. Cannot find a valid baseurl for repo
centos7のサポート終了につき、yum install
時に以下のようなエラーが出ることがあるかと思います
Cannot find a valid baseurl for repo: base/7/x86_64
Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
そのため/etc/yum/repos.d/CentOS-*
ファイル中のrepositoryのurlを以下のように直接かsedコマンドで編集します(参考)
// before
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
// after
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
# sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
# sed -i 's|# baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
2. scl enable
インストールしたpythonを有効にするためにscl enable
を使うと以下のようにパスが上書きされますが、exitや再起動などで設定はリセットされるので再度更新が必要
# which python
/usr/bin/python
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# scl enable rh-python38 bash
# which python
/opt/rh/rh-python38/root/usr/bin/python
# echo $PATH
/opt/rh/rh-python38/root/usr/local/bin:/opt/rh/rh-python38/root/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
毎回更新するのが面倒なのでログイン時に反映させたい場合
/etc/profile.d
配下に適当なスクリプトを用意します
#!/bin/bash
source scl_source enable rh-python38
これで毎回scl enable
せずに済みます
3. scl enable
使わずにやる場合
exportコマンドでパスを通します
こちらも同様にexitや再起動でリセットされるので注意
# python -V
Python 2.7.5
# export PATH=/opt/rh/rh-python38/root/usr/local/bin:/opt/rh/rh-python38/root/usr/bin:$PATH
# python -V
Python 3.8.13
またはlnコマンドでシンボリックリンクを作成
これはexitなどしても引き続き反映され続ける
# ln -s /opt/rh/rh-python38/root/bin/python3.8 /usr/bin/python3
# python3 -V
Python 3.8.13
以下のように/usr/bin/python
へシンボリックリンク作成する場合は注意
# ln -sf /opt/rh/rh-python38/root/bin/python3.8 /usr/bin/python
# python -V
Python 3.8.13
以下のようにyumが使えなくなることがある
これはyumのスクリプトがpython2.7で動いていることによるらしい
# yum install which
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax
この状況で解決する場合は/usr/bin/yum
の1行目を#! /usr/bin/python2
にします
// before
# head -1 /usr/bin/yum
#!/usr/bin/python
// after
# head -1 /usr/bin/yum
#! /usr/bin/python2
デフォルトのシンボリックリンクは以下
# ls -l /usr/bin/python
lrwxrwxrwx 1 root root 7 Jul 14 12:12 /usr/bin/python -> python2
# ls -l /usr/bin/python2
lrwxrwxrwx 1 root root 9 Jul 14 12:12 /usr/bin/python2 -> python2.7