今回はPythonネタ。

本WEBサーバの稼働するArchLinuxでのことなのですが、
pythonのpipのパッケージを更新しようと思いパッケージ一覧をリスト表示させようとしたところ、
以下のようなエラーが発生しました。


$ python3 -m pip list  --outdated                                                                                                                 

Traceback (most recent call last):
  File "/usr/lib/python3.10/runpy.py", line 196, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/lib/python3.10/runpy.py", line 86, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3.10/site-packages/pip/__main__.py", line 21, in <module>
    from pip._internal.cli.main import main as _main
  File "/usr/lib/python3.10/site-packages/pip/_internal/cli/main.py", line 8, in <module>
    from pip._internal.cli.autocompletion import autocomplete
  File "/usr/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py", line 9, in <module>
    from pip._internal.cli.main_parser import create_main_parser
  File "/usr/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py", line 7, in <module>
    from pip._internal.cli import cmdoptions
  File "/usr/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py", line 22, in <module>
    from pip._internal.cli.progress_bars import BAR_TYPES
  File "/usr/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py", line 9, in <module>
    from pip._internal.utils.logging import get_indentation
  File "/usr/lib/python3.10/site-packages/pip/_internal/utils/logging.py", line 14, in <module>
    from pip._internal.utils.misc import ensure_dir
  File "/usr/lib/python3.10/site-packages/pip/_internal/utils/misc.py", line 29, in <module>
    from pip._internal.locations import get_major_minor_version, site_packages, user_site
  File "/usr/lib/python3.10/site-packages/pip/_internal/locations/__init__.py", line 14, in <module>
    from . import _distutils, _sysconfig
  File "/usr/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py", line 8, in <module>
    from pip._internal.exceptions import InvalidSchemeCombination, UserInstallationInvalid
ImportError: cannot import name 'InvalidSchemeCombination' from 'pip._internal.exceptions' (/usr/lib/python3.10/site-packages/pip/_internal/exceptions.py)

考えた解決策

どうやって解決しましょうかね、ということで、
まずは、以下を試しました。

1)python-pipの再インストール(上書き)

以下コマンドを実行

$ sudo pacman -S python-pip

結果、変わらず。

2)python-pipの再インストール(一度削除後、新規)

以下コマンドを実行

$ sudo pacman -R python-pip
$ sudo pacman -S python-pip

これも結果、変わらず。

3)python-pipのディレクトリ(site-packages)を削除してから再インストール

以下コマンドを実行

$ sudo rm -rf /usr/lib/python/site-packages
$ sudo pacman -S python-pip

これでも直らず。

4)python-pipのキャッシュを削除してみる。

以下コマンドを実行

 $ python -m pip cache purge

これでも直らず。。。

5)ensurepipを使う

ドキュメントを調べてみたところこのようなオプションを発見。

ensurepip パッケージは pip インストーラを既にインストールされている Python 環境や仮想環境にブートストラップする助けになります。このブートストラップのアプローチは pip が独立したリリースサイクルを持ち、最新の利用可能な安定版が CPython リファレンスインタープリタのメンテナンスリリースや feature リリースにバンドルされていることを反映しています。
ほとんどの場合、Python のエンドユーザーがこのモジュールを直接呼び出す必要はないでしょう(pip はデフォルトでブートストラップされるからです)。しかし、もし Python のインストール時に pip のインストールをスキップしたり、仮想環境を構築したり、明示的に pip をアンインストールした場合、直接呼び出す必要があるかもしれません。

https://docs.python.org/ja/3/library/ensurepip.html

というわけで、以下コマンドを実行してみます。

$ sudo python -m ensurepip

Looking in links: /tmp/tmp5uaro2m8
Processing /tmp/tmp5uaro2m8/setuptools-58.1.0-py3-none-any.whl
Processing /tmp/tmp5uaro2m8/pip-21.2.4-py3-none-any.whl
Installing collected packages: setuptools, pip
Successfully installed pip-21.2.4 setuptools-58.1.0

というメッセージが表示されました。
そして、以下を実施したところ、直りました。

$ sudo python -m pip list

Package    Version
---------- -------
pip        21.2.4
setuptools 58.1.0

というわけで、再度追加したパッケージは再インストールになりますが、
破損したpythonのpip環境は復旧できました。


まとめ

今回はArchLinuxにおいて破損してしまったpython-pipの環境の復旧方法について、
python -m ensurepipを使って復旧する方法を紹介しました。

何かの参考になれば幸いです。