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
直った。