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

説明なんていらねぇって人は、一番最後の[最後に実行すべきコマンドをまとめます。](https://qiita.com/Suzukaze31/items/e6d15ddd9ffcd5e6c246#%E6%9C%80%E5%BE%8C%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%99%E3%81%B9%E3%81%8D%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%BE%E3%81%99)へどうぞ。

#結果
ここでは基本的に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/pip`の`line 9`にある`from pip import main`と言うところですよということである。
つまりあるべきところに「main」がないので、うまくimportできないのである。
このErrorの原因は他のwebサイトでも解説されているように、version-8以下とversion-9以上が非互換であるせいである。version-8仕様のファイルではversion-9以上は上手く動作することができない。

<kbd>pip(python-pip)とpip3(python3-pip)の違い<kbd\>

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

#対処
<kbd>一つ目の対処<kbd\>

他のwebサイトでは、まず

`$ sudo python3 -m pip uninstall pip`

を行い、ライブラリは

`$ python3 -m pip install numpy`

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

`$ pip3 install numpy`

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

<kbd>二つ目の対処<kbd\>

まず、`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」を実行する。
```

以上。