Python3.6と3.9を共存させようとして結局3.6はアンインストール

前にpipコマンドをPython3.9にするためにPython3.6をアンインストールしたけれど、本番環境ではPython3.6を残す方向でインストールしたときの覚書。
参考: Python3.6からPython3.9に切り替える

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

Python3.6だけでいいかな?と思ったけれど、バッチ処理がPython3.6だと90分掛かるのに対して、Python3.9だと10分ほどで終わるので速度メリットが圧倒的すぎる。

そもそもPythonの世界では1つのPCで複数のバージョンやライブラリを使うのが普通であり、そのためのvenvモジュールが用意されている。次回venvを試す予定。

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

確認
# python3.9 --version

python3コマンドとpythonコマンドのバージョンを変えない。
一応alternativesに登録されているか確認。
# alternatives --list
# alternatives --config python3
# alternatives --config python

pipコマンドの確認
# pip --version
# which pip

pip 21.3.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

# python3.9 -m pip --version

pip 20.2.4 from /usr/lib/python3.9/site-packages/pip (python 3.9)

とりあえずアップデートする
# python3.9 -m pip list
# python3.9 -m pip install -U pip setuptools
# python3.9 -m pip list

そうしたらpipコマンドは3.9に置き換わっていた。
# pip --version

pip 22.0.4 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)

ん?これでpython3.6のpipを更新したらまた置き換わるのかな?
# python3.6 -m pip install -U pip

WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 21.3.1; however, version 22.0.4 is available.
You should consider upgrading via the '/usr/bin/python3.6 -m pip install --upgrade pip' command.

ダメじゃん。venvを使えと言われた。

これからはpipのショートカットコマンドを使わずに「python3.9 -m pip」で実行することにした。

certbotが動くか確認
# certbot renew

Python 3.6 support will be dropped in the next release of Certbot - please upgrade your Python version.

んー、どうしよ?


Python3.6をアンインストール

結局どっちがメインか分からなくなるのでPython3.6は削除することにした。

Python3.6をアンインストール
# dnf remove python36

ライブラリを削除
(/usr/local/lib/python3.6/はpip installしたモジュールの保存場所)
# rm -rf /usr/local/lib/python3.6/

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

pythonコマンドをPython3.9に変えて確認。
# alternatives --config python
# python --version
# pip --version

前はdnf(yum)でエラーになっていたので確認。
# dnf update

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

前はrequestsだったけど今度はsixというモジュールがないというエラー。
platform-python経由でインストール。
(そのあとやっぱりrequestsのエラーが出た)
# /usr/libexec/platform-python -m pip install six requests

この本番環境はcertbotを使うのでインストール
# python -m pip install certbot

確認
# certbot --version
# which certbot

cronに設定したcertbotコマンドを確認
# more /etc/cron.d/certbot

確認のため実行してみる。
# /usr/local/bin/certbot renew && /bin/systemctl reload nginx

大丈夫そう。


【関連記事】