Pythonの仮想環境構築

最近Raspberry Pi 3でwebアプリを作ろうと奮闘しております。システムにインストールされているPythonと分別する意味でも仮想環境下にPython環境を構築したほうが良いという情報をよく目にしたため、仮想環境の構築と日頃使っているライブラリのインストールを行いました。環境はUbuntu MATE 16.04で行っております。

そもそも仮想環境とは

あくまで自分の理解の範疇で書きます。間違っている点も多々あると思いますのでその点はご了承ください。

そもそもPCでコマンドが使用できるのは/bin以下に使用したいコマンドのバイナリファイルがあるためです。普通に使用する分にはいわゆる普通のインストール(バイナリファイルが/bin以下に格納される)をすれば良いです。しかし/bin以下にインストールされたコマンドはシステム全体で利用されるためシステムのPython環境を汚染します。具体的にはライブラリのコンフリクト等が起きるのではないかと思われます。こういった事態を避けるためにシステムとはまた別の環境を作り、その環境にPythonをインストールすることでシステムのPython環境を汚染することなくPython環境を構築することができます。

Ubuntuに仮想環境を構築する

現在Raspberry Pi 3にUbuntu MATE 16.04をインストールしサーバーとして使っています。このマシンにPythonの仮想環境を構築しました。Ubuntu MATE 16.04にはデフォルトでPython3.5が入っており、Python3.5ではvenvというモジュールを用いて仮想環境を構築します[1]。仮想環境を構築したいディレクトリに移動、もしくはディレクトリを作製し、そのディレクトリ以下に仮想環境を構築します。以下ではhogeというディレクトリを作製し、そこに仮想環境を構築しています。

mkdir ~/hoge
python3 -m venv ~/hoge

これで~/hoge以下に仮想環境が構築されました。この仮想環境をアクティベートするには

source ~/hoge/bin/activate

コマンドを打ちます。 するとプロンプトが

user@machine:~$

から

(hoge) user@machine:~$

となります。UbuntuのシステムにはPython2とPython3のどちらもインストールされているのでPythonのバージョンを指定して起動するためにpythonとするとPython2がpython3とするとPython3が起動するようになっています。しかし構築した仮想環境をアクティベートすると仮想環境下にはPython3のみがインストールされており、pythonと打つだけでPython3が起動するようになります。同様にシステムのPython環境ではpipでPython2のライブラリのインストールが、pip3でPython3のライブラリのインストールができますが、仮想環境下ではpipでPython3のライブラリがインストールされます。自分はここで詰まったので一応書いておきます。

またよく使っているPythonライブラリのnumpy, matplotlibをインストールしました。

(hoge) user@machine:~$ pip install numpy

とするとnumpyがインストールされました。 同様に

(hoge) user@machine:~$ pip install matplotlib

とするとmatplotlibがインストールされるかと思いきやエラーが出ました。

エラーログを読んでみるとfreetypepngというライブラリが必要だけど入ってないよという内容でした。ここで注意するべきはfreetypepngPythonのライブラリではなく、システムにインストールするライブラリです。ここでも自分は詰まりました…笑

sudo apt install freetype png

とするとどうもそのような名前のライブラリはないよということを言われました。 そこで[2]を参考にpngを、[3]を参考にfreetypeをインストールするとmatplotlibのインストールができました。

さらっと書いてはいますがmatplotlibのインストールするだけで2, 3日かかってます笑

参考と轍づくりのために書いておきました。それでは。

[1] 28.3. venv — 仮想環境の作成 — Python 3.6.1 ドキュメント
[2] Ubuntu15.04でpipでMatplotlibがインストールできない件 - python3.4から始めるプログラミング日記
[3] matplotlibのインストールでつまづいた話 - Qiita