Python
pip
pip3

pipのエラーAttributeError: '_NamespacePath' object has no attribute 'sort'をなおした話

はじめに

pip install hogepip listを行おうとしても以下のようなエラーが出てきたのでその対処法をまとめます。

error
tk@tk-ThinkPad-E480:~$ pip list                                                                                                                                                                            [193/193]
Traceback (most recent call last):
  File "/home/tk/anaconda3/bin/pip", line 7, in <module>
    from pip import main
  File "/home/tk/anaconda3/lib/python3.5/site-packages/pip/__init__.py", line 43, in <module>
    from pip.utils import get_installed_distributions, get_prog
  File "/home/tk/anaconda3/lib/python3.5/site-packages/pip/utils/__init__.py", line 27, in <module>
    from pip._vendor import pkg_resources
  File "/home/tk/anaconda3/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 3018, in <module>
    @_call_aside
  File "/home/tk/anaconda3/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 3004, in _call_aside
    f(*args, **kwargs)
  File "/home/tk/anaconda3/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 3046, in _initialize_master_working_set
    dist.activate(replace=False)
  File "/home/tk/anaconda3/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2578, in activate
    declare_namespace(pkg)
  File "/home/tk/anaconda3/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2152, in declare_namespace
    _handle_ns(packageName, path_item)
  File "/home/tk/anaconda3/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2092, in _handle_ns
    _rebuild_mod_path(path, packageName, module)
  File "/home/tk/anaconda3/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py", line 2121, in _rebuild_mod_path
    orig_path.sort(key=position_in_sys_path)
AttributeError: '_NamespacePath' object has no attribute 'sort'


実行環境

Ubuntu 16.04.4 LTS
Python 3.5.1 :: Anaconda 4.0.0 (64-bit)
pip 9.0.3

解決方法

最初に方法を、その後にコードを書きます。

エラーが出た__init__.pyの2121〜2122行目を編集します。
自分の場合は上述のようなエラーが出たのでパスは/home/tk/anaconda3/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.pyになります。
下のようにもともとあったコード(2行目まで)をコメントアウトして、3〜5行目を追加します。

what_to_do
#orig_path.sort(key=position_in_sys_path)
#module.__path__[:] = [_normalize_cached(p) for p in orig_path]
orig_path_t = list(orig_path)
orig_path_t.sort(key=position_in_sys_path)
module.__path__[:] = [_normalize_cached(p) for p in orig_path_t]

では実際にやっていきましょう。
2121行目とか見てられないので、lessを使ってorig_path.sortを検索、ハイライトさせて表示させます。

less
sudo less -p orig_path.sort /home/tk/anaconda3/lib/python3.5/site-packages/pip/_vendor/pkg_resources/__init__.py

すると該当の箇所がハイライトされた状態で__init__.pyが開かれるので、Vを押してエディターを開きます。
あとは上のように元々あった2行をコメントアウト、新たに3行を追加して終わりましょう。
エディターを終了するときはCtrl + xyで終了し、lessを終了するときはqを入力してください。

参照