[Python] Ubuntu14.04 venv導入時エラー、その解決方法

この記事は、シリーズ「Pythonではぜひともvenvを使おう」の一部です。( 3 / 3 )

問題

仮想環境作成時に発生

通常、venv仮想環境を作成するときは、以下のようにします。

$ python3.6 -m venv venv

このコマンドを実施したとき、Ubuntu14.04では、以下のようなエラーに遭遇することがあります。

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: ['/path/to/venv_sample/venv/bin/python3.6', '-Im', 'ensurepip', --upgrade', '--default-pip']

内容は、「ensurepipが無効だから仮想環境がうまく作成できませんでした。apt-get install python3-venvしてね」とのことです。

提示コマンドを叩いてみてもダメ

しかし、指示通りのコマンドを実行すると、以下のようなエラーとなります。

$ apt-get install python3-venv
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
E: パッケージ python3-venv が見つかりません

バージョンを具体的に指定してみてはどうかと思っても、ダメ。

$ venv_sample sudo apt-get install python3.6-venv
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
python3.6-venv : 依存: python-pip-whl (>= 8.1.0-2) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

原因

aptリポジトリにて、pip/venv関連のパッケージが壊れていることが原因のようです。
はっきりしたことがわかったら追記する予定です。具体的原因について詳細をご存知の方いらっしゃいましたらご教示ください。

解決方法

概要

pipが自動で入らないことでエラーがおきているので、仮想環境の構築を以下の2段階で行います。
1. pip抜きでvenv仮想環境を作成する
2. 作成した仮想環境を有効にし、その中でpipを導入する

手順

–without-pip

venvのとる引数に、--without-pip というオプションがあります。
これを付与すると、上記のエラーは発生せず、仮想環境の作成は成功します。

$ python3.6 venv --without-pip venv

pipのインストール

仮想Python環境にpipをインストールします。まずは仮想環境を有効にします。

$ source venv/bin/activate

この段階では、pipはグローバルのものが有効になっています。

$ which python  # -> path/to/project_dir/venv/bin/python (仮想環境のpython)
$ which pip     # -> /usr/local/bin/pip (global環境のpip)

pipインストールのためのpythonスクリプトをダウンロードします。

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

ダウンロードしてきたスクリプトを実行します。

$ python get-pip.py

重要! 一度仮想環境に入り直します。

$ deactivate
$ source venv/bin/activate

ちゃんと入ったか確認

以下のようになっていれば、pipが導入できています。
おつかれさまでした。

$ which pip
$ path/to/project_div/venv/bin/pip (仮想環境のpip)

おまけ:便利にする

毎回これを手作業で行うのはちょっとやってられないので、筆者はシェルスクリプトを用意しています。

#!/bin/zsh
set -eu
python3.6 -m venv --without-pip venv
curl -O https://bootstrap.pypa.io/get-pip.py
(){ setopt local_options unset; source venv/bin/activate }
python get-pip.py
(){ setopt local_options unset; deactivate }
(){ setopt local_options unset; source venv/bin/activate }
この記事は、シリーズ「Pythonではぜひともvenvを使おう」の一部です。( 3 / 3 )