WSL の Ubuntu の Python に pip がない

WSL の Ubuntu には Python が標準でインストールされていましたので、Python を主に使っていこうと思っています。 が、Python で仮想環境を作成しようとしたらエラーになったので調べてみました。

エラーの内容

エラーの内容は次の通りです。

$ python3 -m venv <DIR>
The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.

    apt-get install python3-venv

You may need to use sudo with that command.  After installing the python3-venv
package, recreate your virtual environment.

Failing command: ['<DIR>/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']

調査

メッセージに python3-venv のパッケージをインストールするように記載されていましたので、

$ apt search python3-venv
Sorting... Done
Full Text Search... Done

リポジトリーから python3-venv のパッケージを探してみましたが、見つかりませんでした。

… pip を 3.4 より前のバージョンの Python でインストールするには?

pip が Python に付属するのは 3.4 以降です。それ以前のバージョンでは、 “Python Packaging User Guide” の記載にしたがって pip 自体をインストールする必要があります。

参考 Python Packaging User Guide: Requirements for Installing Packages

Python モジュールのインストール — Python 3.6.3 ドキュメント

$ python3 --version
Python 3.5.2

Python のバージョンは 3.5 なので pip もあるはずだと思っているのですけど。

解決策

メッセージで検索すると次の記事が見つかりました。

To resolve this problem, first install the venv, without pip, like this

And then if you install pip, like this, it will still fail

So, you need to install, pip separately, like mentioned in the pip's official documentation. So, the actual list of steps go like this

Python's Venv Problem With Ensurepip in Ubuntu - thefourtheye's weblog

Ubuntu 14.04 の頃の話なので、結構前なのかもしれません。 それによると、その頃の Ubuntu の Python の ensurepip モジュールにバグがあったみたいなのですが、それが今にも続いているということなのでしょうか。

解決策として、pip なしで仮想環境を作成して、その仮想環境の中に pip を個別でインストールしているようです。

実際に確認してみる

$ python3 -m venv --without-pip testdir
$ cd testdir
$ source bin/activate
(testdir) $ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1558k  100 1558k    0     0   485k      0  0:00:03  0:00:03 --:--:--  485k
(testdir) $ python get-pip.py
Collecting pip
  Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 492kB/s
Collecting setuptools
  Downloading setuptools-38.2.3-py2.py3-none-any.whl (489kB)
    100% |████████████████████████████████| 491kB 1.9MB/s
Collecting wheel
  Downloading wheel-0.30.0-py2.py3-none-any.whl (49kB)
    100% |████████████████████████████████| 51kB 2.3MB/s
Installing collected packages: pip, setuptools, wheel
Successfully installed pip-9.0.1 setuptools-38.2.3 wheel-0.30.0

pip がインストールできたようです。

(testdir) $ which pip
/path/to/testdir/bin/pip
(testdir) $ pip -V
pip 9.0.1 from /path/to/testdir/lib/python3.5/site-packages (python 3.5)

仮想環境の中に pip があることが確認できました。 pip のバージョンは 9.0.1 でした。

(testdir) $ deactivate
$ which pip

仮想環境の外には pip がないことが確認できました。

グローバルな環境に pip をインストールする場合は

仮想環境の外で get-pip.py をダウンロードして実行すれば良さそうでしょうか。

終わり

Python の仮想環境は bin/activate に絶対パスが記述されていて、仮想環境のディレクトリーを移動したりすると、もう一度 python3 -m venv をしなければいけないところがあまり好きになれないです。

1 July 2018 追記

Qiita に引用していただいていたのを見ました。 読んでいただきましてありがとうございます。

原因をちゃんと書いてなかったので追記しようと思います。 ここに書いてもまた読んでもらえるとは思わないですけれども。

venv is available by default in Python 3.3 and later, and installs pip and setuptools into created virtual environments in Python 3.4 and later.

Creating Virtual Environments

python3 -m venv のデフォルトの動作はグローバルにある pip を仮想環境の中にインストールしているんだと思います。 けれども、 WSL の Ubuntu にある Python は、なぜかグローバルに pip がないみたいです。 だからグローバルにない pip を仮想環境にインストールしようとしてエラーになっているということだと思っています。

原因はグローバルに pip がないことだと思います。

タイトルに書いたので書いたつもりになって、本文にそのことを書いていませんでした。

対処の一つとして、 python3 -m venv --without-pip testdir とすることで pip をインストールしないで仮想環境を作成しました。 そして後から仮想環境の中に pip をインストールしました。

それじゃ毎回 --without-pip と pip のインストールをするのが面倒くさいという意見もあるかもしれません。 その場合はグローバルに pip をインストールすれば解消できると思います。 多分。

次のようなコマンドになると思います。

最初にグローバルに pip をインストールします。 ここではまだ仮想環境を作っていないですし、仮想環境の中でもありません。

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

一度グローバルに pip をインストールしてしまったら後はもう pip をインストールする必要はありません。

仮想環境を作ります。 これはグローバルに pip があるときと同じように(実際にあるし)デフォルトのオプションで仮想環境を作っています。

$ python3 -m venv testdir
$ cd testdir
$ source bin/activate
(testdir) $

Install to the user site [3]:

python get-pip.py --user

get-pip.py options

pip をインストールする場合は --user をつけた方がシステム領域を汚さないのでいいと思っています。 こうすると ~/.local/ の中に pip をインストールしてくれます。 sudo する必要もありません。

次の記事にグローバルに pip をインストールしたときのことを書きました。

Python の Pipenv を使ってみました