Cloud9を作ったらPythonとpipのバージョンが違う時の対応方法


# 事象 : Python3なのにpipがPython2になっている
- 環境 : Cloud9(EC2 instance / Amazon Linux 2)

はじめてのCloud9を作った！ら、Pythonとpipのバージョンが違う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/b5b3a862-6741-14c9-8ce9-f7d9068b44c5.png)
Python3を指定しているのになぁぜぇ

[AWS Cloud9にてpython3を使用して開発する際の注意事項 - Qiita](https://qiita.com/overflowfl/items/c4b9dd8e4920843fe48c)を参考に確認してみた。

```bash
$ python -V
Python 3.7.9
$ pip -V
pip 9.0.3 from /usr/lib/python2.7/site-packages (python 2.7)
$ sudo python -V
Python 2.7.18
$ sudo pip -V
pip 9.0.3 from /usr/lib/python2.7/site-packages (python 2.7)
$ which python
alias python='python3'
        /usr/bin/python3
$ sudo which python
/bin/python
$ which pip
/usr/bin/pip
$ sudo which pip
/bin/pip
```

## 原因 : バージョンの確認方法が間違っているから
- 参考
    - [pip: Python環境構築ガイド - python.jp](https://www.python.jp/install/centos/pip.html)
    - [Pythonの&quot;-m&quot;オプションが探しに行っている場所 - Bye Bye Moore](https://shuzo-kino.hateblo.jp/entry/2016/11/08/224859)


```bash:Python3のpipの使い方
$ python -m pip ...
```

### 対応 : 正しい方法でバージョンを確認する

```bash
$ python -m pip -V
pip 9.0.3 from /usr/lib/python3.7/site-packages (python 3.7)

# ついでにアップデート
$ python -m pip install --upgrade --user pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/ab/11/2dc62c5263d9eb322f2f028f7b56cd9d096bb8988fcf82d65fa2e4057afe/pip-20.3.1-py2.py3-none-any.whl (1.5MB)
    100% |████████████████████████████████| 1.5MB 682kB/s 
Installing collected packages: pip
Successfully installed pip-20.3.1

$ python -m pip -V
pip 20.3.1 from /home/ec2-user/.local/lib/python3.7/site-packages/pip (python 3.7)

# ちなみにpip3を使うと注意されます。
$ pip3 -V
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 20.3.1 from /home/ec2-user/.local/lib/python3.7/site-packages/pip (python 3.7)
```

## 間違った原因 : 古いバージョンのpipをみているから
ユーザのPythonがaliasでpython3を参照しているので、pipも種類がほかにあるのでは？と思ってみてみたらあった。

```bash
$ ls -la /usr/bin/ | grep pip
-rwxr-xr-x  1 root root        2291 Jul 31  2018 lesspipe.sh
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip2
lrwxrwxrwx  1 root root           9 Nov  6 19:57 pip-2 -> ./pip-2.7
lrwxrwxrwx  1 root root           8 Nov  6 19:57 pip-2.7 -> ./pip2.7
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip2.7
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip3
lrwxrwxrwx  1 root root           9 Nov  6 19:57 pip-3 -> ./pip-3.7
lrwxrwxrwx  1 root root           8 Nov  6 19:57 pip-3.7 -> ./pip3.7
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip3.7
```

## 対応 : Cloud9を「Amazon Linux」で作り直す
「Amazon Linux 2」を「Amazon Linux」にした・・・対応にならない対応・・・

```bash:作り直したCloud9
# ユーザーのバージョン
$ python -V
Python 3.6.12
$ pip -V
pip 9.0.3 from /usr/lib/python3.6/dist-packages (python 3.6)

# rootのバージョン
$ sudo python -V
Python 3.6.12
$ sudo pip -V
pip 9.0.3 from /usr/lib/python3.6/dist-packages (python 3.6)

# alternativesも登録されている
$ sudo update-alternatives --config python

There are 2 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*  1           /usr/bin/python2.7
 + 2           /usr/bin/python3.6

Enter to keep the current selection[+], or type selection number: 2
```

### うまくいかない対応 : alternativesにpipを登録してpipの新しいバージョンを指定する
参考 : [複数のPython バージョンをupdate-alternativesで管理する (Ubuntu) - Qiita](https://qiita.com/KoheiQiita/items/ee27a9c53dc57d90e7b3)

[この方法・・・うまくいったと思ったら・・・後でYumが壊れて対応したので・・・この方法もダメということで。](https://qiita.com/ponsuke0531/items/d6550b43cd2ab34ca17a)

```bash
# もともと/usr/bin/pipがあるので、
$ sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3.7 1
failed to link /usr/bin/pip -> /etc/alternatives/pip: /usr/bin/pip exists and it is not a symlink

# /usr/bin/pipをリネームして、
$ sudo mv /usr/bin/pip /usr/bin/pip-old
$ ls -la /usr/bin/ | grep pip
-rwxr-xr-x  1 root root        2291 Jul 31  2018 lesspipe.sh
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip2
lrwxrwxrwx  1 root root           9 Nov  6 19:57 pip-2 -> ./pip-2.7
lrwxrwxrwx  1 root root           8 Nov  6 19:57 pip-2.7 -> ./pip2.7
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip2.7
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip3
lrwxrwxrwx  1 root root           9 Nov  6 19:57 pip-3 -> ./pip-3.7
lrwxrwxrwx  1 root root           8 Nov  6 19:57 pip-3.7 -> ./pip3.7
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip3.7
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip-old

# alternativesにpipの新しいバージョンを指定して登録する
$ sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3.7 1

# Python3のpipになった！
$ python -m pip -V
pip 20.3 from /home/ec2-user/.local/lib/python3.7/site-packages/pip (python 3.7)
```

知らなかったのですがpip10以降は`pip`は非推奨で`python -m pip`と書いて使うそうです。
参考 : [pipを直で使うのは非推奨っぽい？ - Qiita](https://qiita.com/taro-hida/items/16006f3622551e231a2e)

```bash
$ pip -V
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599 for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
pip 20.3 from /home/ec2-user/.local/lib/python3.7/site-packages/pip (python 3.7)
```

### うまくいかない対応 : aliasで新しいバージョンのpipを設定する
.bashrcにaliasを設定して新しいバージョンのpipを使おうと思った、
ら、その後`pip install --upgrade --user pip`しておかしなことになってしまった。

```bash
# aliasを設定して
$ vi ~/.bashrc
$ cat ~/.bashrc | grep pip
alias pip=pip3
# 反映して
$ source ~/.bashrc
# 新しいバージョンを使うことにする
$ pip -V
pip 9.0.3 from /usr/lib/python3.7/site-packages (python 3.7)
# 古いからアップデートしよーーっと
$ pip install --upgrade --user pip
# pip3もpip3.7も消失してわけわからん状態になり・・・Cloud9を作り直した
$ ls -la /usr/bin/ | grep pip
-rwxr-xr-x  1 root root        2291 Jul 31  2018 lesspipe.sh
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip2
lrwxrwxrwx  1 root root           9 Nov  6 19:57 pip-2 -> ./pip-2.7
lrwxrwxrwx  1 root root           8 Nov  6 19:57 pip-2.7 -> ./pip2.7
-rwxr-xr-x  1 root root         206 Jan 28  2020 pip2.7
lrwxrwxrwx  1 root root           9 Nov  6 19:57 pip-3 -> ./pip-3.7
lrwxrwxrwx  1 root root           8 Nov  6 19:57 pip-3.7 -> ./pip3.7
```

### うまくいかない対応 : Pythonのバージョンを3に設定する
参考 : [Cloud9 Python3でpipも3にする | ヤマムギ](https://www.yamamanx.com/cloud9-python3/)

```bash
# えーーー何も表示されない！
$ sudo update-alternatives --config python
$

# alternativesにPythonないし！
$ sudo alternatives --list
libnssckbi.so.x86_64    auto    /usr/lib64/pkcs11/p11-kit-trust.so
mta     auto    /usr/sbin/sendmail.postfix
cifs-idmap-plugin       auto    /usr/lib64/cifs-utils/cifs_idmap_sss.so
ld      auto    /usr/bin/ld.bfd
iptables        auto    /usr/sbin/iptables-legacy
java    auto    /usr/lib/jvm/java-11-amazon-corretto.x86_64/bin/java
javac   auto    /usr/lib/jvm/java-11-amazon-corretto.x86_64/bin/javac
go      auto    /usr/lib/golang/bin/go

# じゃ、登録してみよう！
$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python3
$ sudo alternatives --list | grep python
python  auto    /usr/bin/python3

# おぉ表示された！そしてPython3が選択されている
$ sudo update-alternatives --config python

There is 1 program that provides 'python'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/python3

Enter to keep the current selection[+], or type selection number: 1

# 何も変わらない・・・
$ python -V
Python 3.7.9
$ pip -V
pip 9.0.3 from /usr/lib/python2.7/site-packages (python 2.7)
```

### うまくいかない対応 : Python3のpipでpipをアップグレードする
終わって思う・・・これでなんでpipがPython3のになると思ったのか・・・困ると何でもやってしまう。
参考 : [python -m pip install --upgrade pip でアップグレードできない時｜Naoki｜note](https://note.com/trailing_note/n/n860514200529)

```bash
# ユーザなのに--userをつけないと怒られる
$ python -m pip install --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/55/73/bce122d1ed0217b3c1a3439ab16dfa94bbeabd0d31755fcf907493abf39b/pip-20.3-py2.py3-none-any.whl (1.5MB)
    100% |████████████████████████████████| 1.5MB 828kB/s 
Installing collected packages: pip
  Found existing installation: pip 9.0.3
    Uninstalling pip-9.0.3:
Exception:
Traceback (most recent call last):
  File "/usr/lib64/python3.7/shutil.py", line 566, in move
    os.rename(src, real_dst)
PermissionError: [Errno 13] Permission denied: '/usr/bin/pip' -> '/tmp/pip-t_dmgr1g-uninstall/usr/bin/pip'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.7/site-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/usr/lib/python3.7/site-packages/pip/commands/install.py", line 365, in run
    strip_file_prefix=options.strip_file_prefix,
  File "/usr/lib/python3.7/site-packages/pip/req/req_set.py", line 778, in install
    requirement.uninstall(auto_confirm=True)
  File "/usr/lib/python3.7/site-packages/pip/req/req_install.py", line 754, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/usr/lib/python3.7/site-packages/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/usr/lib/python3.7/site-packages/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/usr/lib64/python3.7/shutil.py", line 581, in move
    os.unlink(src)
PermissionError: [Errno 13] Permission denied: '/usr/bin/pip'

# --userをつけてアップグレードする
$ python -m pip install --upgrade --user pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/55/73/bce122d1ed0217b3c1a3439ab16dfa94bbeabd0d31755fcf907493abf39b/pip-20.3-py2.py3-none-any.whl
Installing collected packages: pip
Successfully installed pip-20.3

# 当然変わらない・・・
$ pip -V
pip 9.0.3 from /usr/lib/python2.7/site-packages (python 2.7)
```