【python】pip環境が破損した際の復旧方法
今回は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を使って復旧する方法を紹介しました。
何かの参考になれば幸いです。