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

2019年7月7日

当サイトはPR広告を利用しています。

この記事ではvenvを使ってPythonの仮装環境を作る方法、作成した仮想環境を利用する方法を解説しています。

最初に仮想環境自体の解説もしていますが、すでにご存知の方は「仮想環境作成手順」からお読みください。

仮想環境とは

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

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

仮想環境のイメージが分かりやすいように環境Aと環境Bのように書きましたが、実際の構成は以下の図ような形になります。

コンピュータ自体の環境はグローバル環境と呼ばれます。グローバル環境内に仮想環境があるのですが、仮想環境に入った時にはグローバル環境のライブラリを利用することはできませんし、グローバル環境に入った状態でも仮想環境のライブラリを利用することはできません。

それはそれぞれの環境で利用できるライブラリは別々の場所に保存されていて、どの環境が有効になっているかでライブラリを探しに行く場所が変わるからです。

Pythonの仮想環境の場合はpythonライブラリをそれぞれの環境で独立して持てることになります。あくまでpython関係のものを別環境として扱えるようにするだけなので、BashコマンドなどPythonに関係ないコマンドであればどの環境でも変わりなく利用できます。

最後に仮想環境のメリットについてお伝えしておきます。それはリセットがしやすいことです。グローバル環境の場合間違ってライブラリをインストールしてしまったらアンインストールする必要があります。アンインストールが必要なライブラリが一個や二個であれば問題はありませんが、いろいろ検証をして大量のライブラリが不要になことが判明したらとても面倒なことになります。

仮想環境の場合は仮想環境自体を簡単に削除することができますし、再作成することもできます。そしてvenvを使えばコマンド一つで仮想環境を作成できます。

仮想環境はとても便利なもので、venvは仮想環境の操作を容易にしてくれる良いツールです。ぜひこれからする説明を参考にしていただき使い方をマスターしてください。

venvとは

“仮想環境とは"の章でも少し説明しましたが、改めてvenvとは何かについて説明します。

venvはpython用の仮想環境操作をサポートしてくれるツールです。

venvを使うことによって、python用仮想環境を作成することが可能になります。これにより特定のpython用ライブラリ(例えばNumpyとか)が入った環境と入っていない環境、バージョンが異なるPythonがインストールされた環境など、複数のPython実行環境を一つのコンピュータの中に構築することが出来ます。

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

仮想環境作成手順

それではvenvを使ってPythonの仮想環境を作成するまでの手順を説明します。複雑なコマンドの場合、コマンドの下に補足説明をしているので参考にしてください。

1. python3-venvをOSにインストール

$ sudo apt install python3-venv

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

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

3. 仮想環境の有効化

$ source virtual_environment_name/bin/activate

4. 仮想環境の無効化

$ deactivate
  • このコマンドはカレントディレクトリがどこでも効きます。

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

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

仮想環境の確認

1. Pythonで利用するライブラリをインストールするためには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. 今度は先ほど作成した仮想環境を有効化してから利用できるライブラリを確認してみます。
 (venvで作った仮想環境ならpipだけでpip3を意味するので"pip list"でOKです。)

# 仮想環境有効化
$ source new_environment_name/bin/activate

# 仮想環境内に存在するPython用パッケージのリストを表示
$ 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用ライブラリをインストールしたら本体の環境はどうなるのか確認してみましょう。

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のベストプラクティス

venvの使い方はわかったと思いますが、実際にどこにどんな名前で作れば良いのかが気になるかと思います。

一つのファイルの実行のためや検証のためであればどこにどんな名称の仮想環境を作成しても良いのですが、gitなどでpythonプロジェクトを管理している場合にはベストプラクティスが存在するために紹介しておきます。

それはプロジェクトのルートディレクトリに`.venv`という名称で作成することです。

cd Pythonプロジェクト
python3 -m venv --prompt . .venv

一般的にこの作り方が良いとされているため、この構成にしているプロジェクトは多く、その結果いろんな人に理解しやすいプロジェクト構成になります。

–promptオプションについても説明しておきます。

–promptは仮想環境を有効化している時にどんな名称を表示させるのかを指定できるコマンドです。–promptを指定せずに.venvという名称で仮想環境を作成すると、仮想環境に入った時の表示が.venvになりどの環境にいるのかが分かりにくくなります。

root@4ba2c5787088:~# cd python_projectA/
root@4ba2c5787088:~/python_projectA# python -m venv .venv
root@4ba2c5787088:~/python_projectA# source .venv/bin/activate
(.venv) root@4ba2c5787088:~/python_projectA# 

–promptオプションを利用することで現在有効化されている仮想環境がわかりやすくなります。先ほど消化した例では.(ドット)を指定していましたが、.を指定するとカレントディレクトリの名称が指定されることになります。よって先ほどの例だと以下のように表示が変わります。

root@4ba2c5787088:~/python_projectA# python -m venv --prompt . .venv
root@4ba2c5787088:~/python_projectA# source .venv/bin/activate
(python_projectA) root@4ba2c5787088:~/python_projectA#

これで.venvという仮想環境用のフォルダであることがわかりやすく、そしてどの仮想環境が有効化されているのか分かりやすい状態になりました。

ここから先は少しgitも関係した発展系なので、gitについての知識がある方は参考にしてください。

まず仮想環境として作成した.venvフォルダにはサイズが大きいpythonライブラリや一時ファイルが入っており、gitでは管理すべきではないフォルダです。そこで.venvはgit管理外にするために.gitignoreファイルに.venv/を追記します。

またどの環境でも同じバージョンのpythonライブラリをインストールできるように情報をファイルとして吐き出しておくと良いです。仮想環境を有効化して必要なpythonライブラリをインストールした状態で以下のコマンドを実行するとファイルに残せます。

pip freeze > requirements.txt

requirements.txtはプロジェクトのルートディレクトリに置かれて管理されることが一般的なため、上記のコマンドはプロジェクトのルートディレクトリで実行しましょう。

別の方がリポジトリをクローンした時には、同様に仮想環境を作成してもらった上で以下のコマンドを実行することで、pip freezeを行った環境と同じpythonライブラリが入った環境を再現することができます。

pip install -r requirements.txt

まとめ

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

参考サイト

直近でおすすめの本

直近十数冊読んだ中で一番おすすめの本です。

ビジネスデザイナーという肩書きを持つイノベーションシンキングの世界的第一人者である濱口秀司さんの書かれた本です。肩書きだけだとどのようなことをしている人か分かりにくいかもしれませんが、USBメモリやマイナスイオンドライヤーなど誰もが知る有名商品の産みの親の方です。

アメリカのコンサルタントの中でも最高額のコンサルティングフィーを受け取っている方で、私の友人から聞いた話だとこの人のコンサルティングを受けるためには1時間でも7桁の額は準備する必要があるとのことでした。

濱口秀司さんは自分の中でイノベーションを起こすための型を持っており、その型について本の中でかなり詳しく教えてくれています。革新的なアイデアを出す方法をここで詳細にはお伝えしませんが、とてもざっくりとまとめると以下の手順になります。

バイアスの特定→バイアスの破壊

革新とは現状の破壊です。現在世の中にあるバイアスを認知するところからアイデアの創出は始まります。この本ではバイアスを認知する方法、そして破壊する方法を詳しく述べてくれています。個人開発をしようとしているけど何を作れば良いか思い浮かばない方やや会社を立ち上げようとしている方に特におすすめの本です。

過去におすすめした本は以下の記事にまとめています。

Pythonvenv

Posted by ラプラス