33
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-09-09

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

#結果
ここでは基本的に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」を実行する。

以上。

33
22
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?