Python3.6からPython3.9に切り替える

開発サーバーのPythonを3.6から3.9に切り替えたときの覚書。
ちなみに本番環境ではgsutilの要件がPython3.8までなのでPython3.6のまま。

環境: CentOS Stream 8, Python 3.6.8, Python 3.9.7

Python3.9をインストール
# dnf install python39

Pythonのコマンドをデフォルトで3.9にして確認
# alternatives --config python3
# alternatives --config python
# alternatives --list

バージョンとパスの確認
# python3 --version

Python 3.9.7

# which python3

/usr/bin/python3


pipの確認
# pip --version
# pip3 --version

/usr/local/binに設置されている。
/usr/local/binはpython3.9がインストールされた/usr/binより優先されてしまうので、python3.6はアンインストールする。
(共存できるためpython3.6をアンインストールする必要はない)
# dnf remove python36

あれ?pipが/usr/local/binに残っている。
シンボリックリンクでないことを確認して手動で削除。
# cd /usr/local/bin
# ll
# rm -f pip*

関係ありそうなライブラリを削除しておく
(/usr/local/lib/python3.6/はpip installしたモジュールの保存場所)
# rm -rf /usr/local/lib/python3.6/

シェルの再読み込み
# cd
# source .bash_profile


pipコマンドをalternativesで登録する。最後の1は優先順位。
参考: alternatives による標準コマンドの切り替え
# alternatives --install /usr/bin/pip pip /usr/bin/pip3.9 1

確認してアップデート
# pip --version
# pip list
# pip install -U pip setuptools

本番環境と合わせるためにcertbotはインストールしておく。
# pip install certbot

付随してインストールされたモジュール確認
インストールされた場所を確認
# pip list
# pip show certbot

最新のcertbotはPython 3.7以上
参考: certbot · PyPI


dnf(yum)でエラー

下記エラーが発生するようになった。
# dnf update

Failed loading plugin "product-id": No module named 'requests'
Failed loading plugin "subscription-manager": No module named 'requests'
Failed loading plugin "upload-profile": No module named 'requests'

ログを見るとpython3.6のパッケージを探している。
# less /var/log/dnf.log

dnf(yum)経由でインストールすればよろしく解決してくれないかと思いやってみる。

まずはdnf経由でインストールするrequestsの依存関係をみる
# dnf install python39-requests

それらをpipでアンインストール
# pip uninstall requests chardet idna pysocks six urllib3

これでdnf経由でインストール
# dnf install python39-requests

クリーンしてアップデート
# dnf clean all
# dnf update

直らない。。。


dnfが内部で使っているplatform-pythonがあるということを発見
参考: Red Hat Enterprise Linux 8 のPython事情 - 赤帽エンジニアブログ

バージョン確認
# /usr/libexec/platform-python --version

Python 3.6.8

このpython経由でrequestsをインストール
# /usr/libexec/platform-python -m pip install requests

確認
# dnf update

直った。


【関連記事】