pip/pip3でのImportError: cannot import name mainについてとその対処。


説明なんていらねぇって人は、一番最後の最後に実行すべきコマンドをまとめます。へどうぞ。

結果

ここでは基本的にPython3での話です。(Python2でも同じやり方でできるはずですが…)

発生プロセスは、まず、Python2,Python3ともにosにデフォルトでインストールされていて、pip/pip3をインストールすると言う場面において、

$ sudo apt install python3-pip

とすると、python3-pipつまりpip3がインストールされます。このとき、pip3のVersionは、おそらく「8.x.x」でしょう。
ここで何らかの理由(Version-9以上でなければならないとか、VersionをUpgradeするようpip/pip3に言われるなど)により、下のコマンドを実行します。

$ pip3 install --upgrade pip

もしくは、

$ sudo -H pip3 install --upgrade pip

すると全てのpip3コマンドで、次のようなErrorがでる。ここでは例として-Vを実行する。

$ pip3 -V

すると、

Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

このような、Errorがでる。

原因

Errorが何を言っているのかと言うと、インポートエラーで「main」という名前のモデュールがインポートできない、そしてどこのことかと言うと/usr/bin/pipline 9にあるfrom pip import mainと言うところですよということである。
つまりあるべきところに「main」がないので、うまくimportできないのである。
このErrorの原因は他のwebサイトでも解説されているように、version-8以下とversion-9以上が非互換であるせいである。version-8仕様のファイルではversion-9以上は上手く動作することができない。

pip(python-pip)とpip3(python3-pip)の違い

pipとpip3は基本的に同じものであるしかし、環境上にpython2とpython3が共存している場合pipだけでは、python2とpython3で互換がないライブラリなどがおかしくなったりそもそも、python2とpython3で別々に管理したいと言う場合に、
python2では、pip → python2用のpip
python3では、pip3(python3-pip) → python3用のpip
と言う使い分けをするのである。

対処

一つ目の対処

他のwebサイトでは、まず

$ sudo python3 -m pip uninstall pip

を行い、ライブラリは

$ python3 -m pip install numpy

このようにpython3を用いてインストールするようにと書かれているが、それはめんどくさいので、今までどおり

$ pip3 install numpy

でライブラリをインストールできるようにする。

二つ目の対処

まず、pip -upgrade pipでインストールしたpip3をアンインストールする。

$ sudo python3 -m pip uninstall pip

そして、aptでインストールしたpip3をアンインストールする。

$ sudo apt autoremove python3-pip

これで、pip3は全てアンインストールされました。そして今度はaptではなくget-pip.pyというブートストラップを使って、標準インストールします。
まず、

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

これで、get-pip.pyがダウンロードされます。そしてget-pip.pyを使ってpip3をインストールします。

$ python3 get-pip.py --user

ここで、ModuleNotFoundError: No module named 'distutils.util'と言うようなErrorが出た場合、python3-distutilsをインストールします。

$ sudo apt install python3-distutils

そしてもう一度、

$ python3 get-pip.py --user

そうすると

Successfully installed pip-19.2.3 setuptools-41.2.0 wheel-0.33.6

pip-19.2.3インストールされるでしょう。(pip-19.x.xと言うべきですが)

最後に実行すべきコマンドをまとめます。

#Python2、Python3両方ともインストールし直す場合。------------------

# -upgradeでインストールされたpipをアンインストール。(No module named pipとでる場合はそのまま進む。)
$ sudo python -m pip uninstall pip
$ sudo python3 -m pip uninstall pip

# aptでインストールされたpipをアンインストール。
$ sudo apt autoremove python3-pip
$ sudo apt autoremove python-pip

# get-pip.pyをダウンロード。
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

# pipを標準インストール。(get-pip.pyがhome dirにあるとして、home dirで実行)
$ python3 get-pip.py
$ python get-pip.py

# 「$ python3 get-pip.py」で「ModuleNotFoundError: No module named 'distutils.util'」と出てくる場合。
$ sudo apt install python3-distutils
# もう一度「$ python3 get-pip.py」を実行する。

#Python3のみインストールし直す場合。-------------------------------

radeでインストールされたpipをアンインストール。(No module named pipとでる場合はそのまま進む。)
$ sudo python3 -m pip uninstall pip

# aptでインストールされたpipをアンインストール。
$ sudo apt autoremove python3-pip

# get-pip.pyをダウンロード。
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py

# pipを標準インストール。(get-pip.pyがhome dirにあるとして、home dirで実行)
# 「--user」をつけることで「sudo」でする必要がなくなる。
$ python3 get-pip.py --user 

# 「$ python3 get-pip.py」で「ModuleNotFoundError: No module named 'distutils.util'」と出てくる場合。
$ sudo apt install python3-distutils
# もう一度「$ python3 get-pip.py」を実行する。

以上。