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
$ 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.
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
pip をインストールする場合は --user
をつけた方がシステム領域を汚さないのでいいと思っています。
こうすると ~/.local/ の中に pip をインストールしてくれます。
sudo する必要もありません。
次の記事にグローバルに pip をインストールしたときのことを書きました。