CentOS7へPython3.8インストールで気をつけること

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コマンドで編集します（[参考](https://qiita.com/vossibop/items/d4fc4c94e5b7714e3a8c)）
```
// 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`配下に適当なスクリプトを用意します
```/etc/profile.d/enablepython38.sh
#!/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
```