【Ubuntu】Pythonの仮想環境をvenvで作る方法

2019年7月7日

この記事ではvenvでPythonの仮装環境を作ってから実際に利用する方法を解説しています。あらかじめ仮想環境についての解説もしていますが、仮想環境とは何かについてすでにご存知の方は「仮想環境作成手順」からお読みください。

前提知識

仮想環境とは

1つのコンピュータの中には普通一つの環境しかありません。そのため何かアプリケーションを有効化したら、そのコンピュータ内のすべての箇所においてそのアプリケーションは有効化された状態になります。

しかし仮想的に環境を作り上げれば、1つのマシンの中に複数の環境を作り上げることが出来ます。環境Aで有効化したアプリケーションは、環境Bでは無効化した状態にしておくことが可能ですし、そもそもインストールさせないことも可能です。

この説明だけだと分かりにくいと思うので、スマホを例にして説明してみます。

仮想環境の例え話

スマホが1台あります。
ブルーライトをカットしてくれるアプリがあり、それはインストールされた直後にスマホの画面を暗くする効果を持ちます。

ここで本当のスマホの環境をAとして、スマホの中に仮想環境Bを作り上げたとしましょう。

仮想環境Bの中に入った状態で、ブルーライトカットアプリをインストールしてみるとスマホの画面が暗くなります。

この状態で仮想環境を抜けて、環境Aの方に移動してみると、
暗かった画面がアプリを入れる前の状態に戻りました。

再度、仮想環境Bに戻ってみると画面が暗くなります。

例え話は以上です。

このように仮想環境の技術を使えば、あるアプリケーションを入れた環境と入れていない環境、もしくは設定が異なる二つの環境を一つのマシンの中に構築することが出来ます。

開発時においてもテスト時においてもとても便利な技術なので是非とも覚えておきましょう。

venvとは

venvはPython用の仮想環境作成をサポートしてくれるモジュールです。
venvを使うことによって、あるpython用ライブラリ(Numpyとか)が入った環境と入っていない環境の二つを一つのマシンの中に構築することが出来ます。

venvのような仮想環境作成機能を持ったモジュールとしてpyenvというものもありますが、こちらはPythonのバージョン3.6から非推奨になっているのでvenvを使う方が良いです。
参考:venv — 仮想環境の作成

仮想環境作成手順

それではvenvを使ってpythonの仮想環境を作成するまでの手順を説明します。

1. venvを使える状態にするためpython3-venvをインストール

$ sudo apt install python3-venv

2. venvを使って仮想環境を作成

$ python3 -m venv new_environment_name
  • “-m"はそのあとに記載されたモジュール(今回で言うとvenv)を実行するというオプションです
  • new_environment_nameのところに作成する仮想環境につけたい名前を入力してください。
  • ちなみに仮想環境は一つのマシン内に何個でも作れます。

3. 仮想環境の有効化

$ source new_environment_name/bin/activate

4. 仮想環境の無効化

$ deactivate
  • このコマンドは自分がどのディレクトリにいても効きます。

仮想環境作成手順は以上です。

ではこれから本当に仮想環境が作成されているか確認してみましょう。

仮想環境の確認

1. python関係のパッケージをインストールするためにはpipというモジュールが必要になるので、以下のコマンドを実行してpipをインストールします。(venvはpipを使ってインストールしたpython関係パッケージを仮想環境ごとに分けて管理してくれます。)

$ sudo apt install python3-pip

2. 仮想環境に入らない(無効化した)状態で下記のpip3 listコマンドを実行します。実行すると今いる環境で利用できるpython関係パッケージが表示されます。

$ pip3 list
DEPRECATION: The default format will switch to columns in the future.
You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
apturl (0.5.2)
asn1crypto (0.24.0)
Brlapi (0.6.6)
certifi (2018.1.18)
chardet (3.0.4)
command-not-found (0.3)
cryptography (2.1.4)
cupshelpers (1.0)
defer (1.0.6)
distro-info (0.18ubuntu0.18.04.1)
httplib2 (0.9.2)
idna (2.6)
keyring (10.6.0)
keyrings.alt (3.0)
language-selector (0.1)
launchpadlib (1.10.6)
lazr.restfulclient (0.13.5)
lazr.uri (1.0.3)
louis (3.5.0)
macaroonbakery (1.1.3)
Mako (1.0.7)
MarkupSafe (1.0)
netifaces (0.10.4)
oauth (1.0.1)
olefile (0.45.1)
〜〜省略〜〜
xkit (0.0.0)
zope.interface (4.3.2)

3. 今度は先ほど作成した仮想環境を有効化してからpip listを実行します。
 (venvで作った仮想環境ならpipと打てばpip3を意味するので"pip list"でOKです。)

# まずは仮想環境有効化
$ source new_environment_name/bin/activate
$ pip list
DEPRECATION: The default format will switch to columns in the future.
You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (39.0.1)

仮想環境外で実行した時よりかなり少ないです。インストールされているpython関係パッケージ数に違いがあることが分かります。

最後に仮想環境でpython関係パッケージをinstallしたら本体の環境はどうなるのか確認してみましょう。

4. 仮想環境内で下記コマンドを実行してnumpyというpython関係パッケージをインストールします。

$ pip install numpy

5. 仮想環境内でpip listを実行し、numpyがインストールされていることを確認します。

$ pip list
DEPRECATION: The default format will switch to columns in the future.
You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
numpy (1.16.4)
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (39.0.1)

numpyが仮想環境にインストールされていることが分かります。

6. 今度は仮想環境を無効化してから、pip3 listを実行します。

$ deactivate
$ pip3 list
DEPRECATION: The default format will switch to columns in the future.
You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
apturl (0.5.2)
asn1crypto (0.24.0)
Brlapi (0.6.6)
certifi (2018.1.18)
chardet (3.0.4)
command-not-found (0.3)
cryptography (2.1.4)
cupshelpers (1.0)
defer (1.0.6)
distro-info (0.18ubuntu0.18.04.1)
httplib2 (0.9.2)
idna (2.6)
keyring (10.6.0)
keyrings.alt (3.0)
language-selector (0.1)
launchpadlib (1.10.6)
lazr.restfulclient (0.13.5)
lazr.uri (1.0.3)
louis (3.5.0)
macaroonbakery (1.1.3)
Mako (1.0.7)
MarkupSafe (1.0)
netifaces (0.10.4)
oauth (1.0.1)
olefile (0.45.1)
pexpect (4.2.1)
Pillow (5.1.0)
pip (9.0.1)
protobuf (3.0.0)
pycairo (1.16.2)
pycrypto (2.6.1)
pycups (1.9.73)
pygobject (3.26.1)
pymacaroons (0.13.0)
PyNaCl (1.1.2)
pyRFC3339 (1.0)
python-apt (1.6.4)
python-dateutil (2.6.1)
python-debian (0.1.32)
pytz (2018.3)
pyxdg (0.25)
PyYAML (3.12)
reportlab (3.4.0)
requests (2.18.4)
requests-unixsocket (0.1.5)
SecretStorage (2.3.1)
setuptools (39.0.1)
simplejson (3.13.2)
six (1.11.0)
system-service (0.3)
systemd-python (234)
ubuntu-drivers-common (0.0.0)
ufw (0.36)
unattended-upgrades (0.1)
urllib3 (1.22)
usb-creator (0.3.3)
wadllib (1.3.2)
wheel (0.30.0)
xkit (0.0.0)
zope.interface (4.3.2)

こちらにはnumpyが入ってないことが分かります。

まとめ

以上でvenvの説明は終了です。

一つのマシンで複数のPython実行環境を構築できるvenvを使い、本体の環境はクリーンな状態を保ちながら開発を行っていきましょう。

参考サイト