Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
19
Help us understand the problem. What is going on with this article?
@Suzukaze31

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

More than 1 year has passed since last update.

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

結果

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

以上。

19
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Suzukaze31
初投稿です。どうぞお手柔らかに。 間違っているところなどあれば指摘してもらえると感謝します。 大体コマンドではEnterが省略されています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
19
Help us understand the problem. What is going on with this article?