BioErrorLog Tech Blog

試行錯誤の記録

Ubuntuでpip/pip3がインストールできないときの対処法 | Python

Ubuntuでは、Pythonのpip/pip3がプリインストールされていませんでした。
これらのインストールに予想外にもつまずいたので、記録を残します。

はじめに

Pythonにパッケージをインストールするときには、pipコマンドが便利です。 しかし、Ubuntuにはデフォルトでpipがインストールされていません。

試しにpandasをpipインストールしてみると、

$ pip install pandas

Command 'pip' not found, but can be installed with:

sudo apt install python-pip

エラーが表示され、代わりにpipのインストール手順が示されます。

しかし、この提示されたインストール手順も、そのままではうまく機能しませんでした。

試行錯誤の結果pip / pip3のインストールに成功したので、その記録を残します。

作業環境

Ubuntu18.04.1 LTS を
Windows10の上に、VMwareによって構築した仮想環境で起動しています。
www.bioerrorlog.work

Ubuntuでpip/pip3をインストールする

pipとpip3は違う

まず、前提としてpipとpip3の違いについて確認させてください。

pip3はPython3を指定したpipコマンド、pipはPython2/3のどちらにも設定できるメインのpipコマンド、という整理のようです。

Pythonの「pip」と「pip3」は何が違う?

お恥ずかしい話、当初pipコマンドはすべてpipで、pip3はおまけのようなものだと思っていました。

しかし、UbuntuのようにPython2とPython3が両方インストールされている場合には、この違いが無視できません。 デフォルトではpipと打てばPython2の、pip3と打てばPython3のpipとして機能します。

逆に、Python2かPython3のどちらか片方しかインストールしていない場合は、pipと打てば該当のPythonが指定されます。

まさに、Pythonプログラムを実行する時のpython/python3コマンドと同じでしょう。 Pyhon3で実行するときはpython3を用い、単にpythonで実行すれば、Python2で実行されます。

今回は、pipとpip3をそれぞれ別々にインストールしていきます。

apt installが機能しない
: pip× / pip3×

それでは、pipとpip3をインストールしてみます。

上述のように、pipを使おうとすると次のインストール手順が提示されます。

pip:sudo apt install python-pip

$ pip install pandas

Command 'pip' not found, but can be installed with:

sudo apt install python-pip


pip3:sudo apt install python3-pip

$ pip3 install pandas

Command 'pip3' not found, but can be installed with:

sudo apt install python3-pip


しかし、このどちらもエラーを吐かれてしまい上手くいきません。 とりあえず別の方法を探します。

"get-pip.py"からpipをインストールする
: pip○ / pip3×

しばらく解決方法を探していると、pipをインストールする他の方法を見つけました。

How to Install Pip on Ubuntu 16.04 LTS | Liquid Web

これによると、"get-pip.py"をあるURLから取得・実行すればいいようです。

URLから"get-pip.py"ファイルを取得するにはcurlコマンドを使います。 デフォルトではインストールされていないので、aptでインストールします。

$ sudo apt install curl

インストールが終わったら、"get-pip.py"ファイルをcurlで取得します。

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

これで、"get-pip.py"ファイルが取得できました。

この"get-pip.py"を、pythonコマンドで実行します。

$ sudo python get-pip.py

これで"get-pip.py"が実行され、pipがインストールされました。

pipのインストールを--versionで確認すると、

$ pip --version
pip 19.0.3 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)

確かにpipがインストールされています。


次は、pip3のインストールを試みます。 "get-pip.py"のコードの中身を少し読んでみるとPython2とPython3の両方の環境に対応していたため、pipと同じ要領で"get-pip.py"をpython3で実行してみます。

$ sudo python3 get-pip.py 
~
ModuleNotFoundError: No module named 'distutils.util'

しかしこのやり方ではエラーを吐かれてしまい、なかなか解消することが出来ませんでした。

apt updateしてからapt installする
: pip○ / pip3○

解決策を探して長いこと右往左往していましたが、実に単純な操作で解決しました。 apt installする前にアップデートしてみたら、上手くいったのです。

アップデートは次のふたつの手順で行いました。

$ sudo apt update
~
$ sudo apt upgrade
~

アップデート終了後に再びpip3をインストールしてみると、

$ sudo apt install python3-pip

見事、今度はエラーなくインストールに成功しました。

pip3がちゃんとインストールされたかを--versionで確認すると、

$ pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

確かにpip3がインストールされていることが分かります。

結論:アップデートしてからapt installすべし

まず行うべきはアップデートです。

$ sudo apt update
$ sudo apt upgrade

ただし、このupdate/upgradeの両方が必要なのか、updateだけで大丈夫なのか、私にはいまいち理解できていません1


その後、pipとpip3をそれぞれapt installします。

$ sudo apt install python-pip
$ sudo apt install python3-pip


上手くいかなければ、"get-pip.py"からpipとpip3をそれぞれインストールします。

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py
$ sudo python3 get-pip.py

おわりに

今回は、Ubuntuでpip/pip3をインストールときの試行錯誤を記録しました。

蓋を開ければ解決方法は単純で、インストール前にアップデートしておくというものです。 これはpip/pip3のインストールのみならず、他の多くのパッケージでも適応できる教訓だと思うので、肝に銘じておきます。

ところで、updateとupgradeは具体的にどのような操作を行っているのでしょうか。 漠然とイメージが掴めるばかりに、実際の処理を私は理解できていません。

知らないことが増えていくのは、楽しいことです。

参考


  1. 多くのネット上の情報で助言されているのは、updateのみでした。