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

この記事ではvenvを使ってPythonの仮装環境を作る方法、作成した仮想環境を利用する方法を解説しています。
最初に仮想環境自体の解説をしていますが、すでにご存知の方は「仮想環境作成手順」からお読みください。
仮想環境とは
1つのコンピュータの中には普通一つの環境しかありません。そのため何かしらアプリケーションをインストールしたら、そのコンピュータ内のすべての箇所においてそのアプリケーションは利用可能な状態になります。

しかし仮想的に別の環境を作り上げれば、1つのマシンの中に複数の環境を作り上げることが出来ます。以下の図を例にすると、環境Aでインストールしたアプリケーションは、環境Bではインストールされておらず使えない状態にすることも可能です。

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

コンピュータ自体の環境はグローバル環境と呼ばれます。グローバル環境内に仮想環境があるのですが、仮想環境に入った時にはグローバル環境のライブラリを利用することはできません。また仮想環境を抜けてグローバル環境にいる状態では仮想環境内のライブラリを利用することはできません。
なぜならそれぞれの環境で利用できるライブラリは別々の場所に保存されていて、どの環境が有効になっているかでライブラリを探しに行く場所が変わるからです。

Pythonの仮想環境の場合はpythonライブラリをそれぞれの環境で独立して持つことになります。あくまでpython関係のものを別環境として扱えるようにするだけなので、aptで入れたOSのパッケージなどPythonに関係ないものであればどの環境でも変わりなく利用できます。
仮想環境は開発を進める上でとても便利なもので、venvはpython仮想環境の操作を容易にしてくれる優れたツールです。ぜひこれからする説明を参考にしていただき使い方をマスターしてください。
venvとは
「仮想環境とは」の章でも少し説明しましたが、改めてvenvとは何かについて説明します。
venvはpython用の仮想環境操作をサポートしてくれるツールです。
venvを使うことによって、python用仮想環境を作成することが可能になります。これにより特定のpython用ライブラリが入った環境と入っていない環境、バージョンが異なるPythonがインストールされた環境など、複数のPython実行環境を一つのコンピュータの中に構築することが出来ます。
仮想環境作成機能を持ったモジュールはvenv以外だとpyenvが有名ですが、pyenvはPythonバージョン3.6から非推奨になっているので今から仮想環境を使うのならvenvを使う方が良いです。参考サイト:venv — 仮想環境の作成
仮想環境作成手順
それではvenvを使ってPythonの仮想環境を作成するまでの手順を説明します。複雑なコマンドの場合、コマンドの下に補足説明をしているので参考にしてください。
1. python3-venvをOSにインストール
$ sudo apt install python3-venv2. venvを使って仮想環境を作成
$ python3 -m venv virtual_environment_name- “-m"はそのあとに記載されたモジュール(今回で言うとvenv)を実行するというオプション
- virtual_environment_nameの個所で仮想環境名を設定可能
- ちなみに仮想環境は一つのマシン内に何個でも作れます。
3. 仮想環境の有効化
$ source virtual_environment_name/bin/activate- 仮想環境名/bin/activateファイルを実行することにより仮想環境が有効化される
- sourceは対象ファイルに書かれたコマンドを実行するコマンド。詳細は以下の記事をご参照ください。
【 source 】コマンド/【 . 】コマンド――シェルの設定を即座に反映させる
4. 仮想環境の無効化
$ deactivate- このコマンドはカレントディレクトリがどこでも効きます。
仮想環境作成・有効化・無効化手順は以上です。
ではこれからは仮想環境が期待通りに作成されているか確認してみましょう。
仮想環境の確認
1. Pythonで利用するライブラリをインストールするためにはpipというパッケージが必要です。以下のコマンドを実行してインストールします。(venvはpipを使ってインストールしたPython用ライブラリを仮想環境ごとに分けて管理します。)
$ sudo apt install python3-pip2. 仮想環境に入らない(無効化した)状態で下記の「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 numpy5. 仮想環境内でpip listを実行し、numpyがインストールされていることを確認します。
$ pip list | grep numpy
numpy (1.16.4)
$numpyが仮想環境にインストールされていることが分かります。
6. 今度は仮想環境を無効化してから、pip3 listを実行します。
$ deactivate
$ pip3 list | grep numpy
$こちらにはnumpyが入ってないことが分かります。
venvのベストプラクティス
venvの使い方はわかったと思いますが、実際にどこにどんな名前で作れば良いのかが気になるかと思います。
一つのファイルの実行のためや検証のためであればどこにどんな名称の仮想環境を作成しても良いのですが、gitなどでpythonプロジェクトを管理している場合にはベストプラクティスが存在するために紹介しておきます。
それはプロジェクトのルートディレクトリに`.venv`という名称で作成することです。
cd Pythonプロジェクト
python3 -m venv --prompt . .venv初めて登場した–promptオプションについて説明します。
–promptは仮想環境を有効化している時にどんな名称を表示させるのかを指定できるコマンドです。–promptを指定せずに単純に.venvという名称で仮想環境を作成すると、仮想環境に入った時の表示が".venv"になってしまいます。そのため複数のpython仮想環境が存在するコンピュータでは、フォルダ移動したときなどにpython仮想環境にいるのかが分かりにくいです。
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という仮想環境用のフォルダであることがわかりやすく、そしてどの仮想環境が有効化されているのか分かりやすい状態になりました。
一般的にこの作り方が良いとされているためこの構成にしているpythonプロジェクトは多く、その結果新メンバーでも理解しやすいプロジェクト構成になります。
ここから先は少しgitに関係した発展系なので、gitについての知識がある方は参考にしてください。
仮想環境として作成した.venvフォルダにはサイズが大きいpythonライブラリや一時ファイルが入っており、実装内容自体にも当たらないためgitで管理すべきではありません。そこで.venvをgit管理外にするために.gitignoreファイルに.venv/を追記します。
またどの環境でも同じバージョンのpythonライブラリをインストールできるように仮想環境にインストールしているpythonライブラリをファイルで吐き出しておくと良いです。仮想環境を有効化して以下のコマンドを実行すると現在有効化されている仮想環境にあるpythonパッケージの一覧をバージョン情報込みでファイルに残せます。
pip freeze > requirements.txtrequirements.txtはプロジェクトのルートディレクトリに置かれて管理されることが一般的なため、上記のコマンドはプロジェクトのルートディレクトリで実行しましょう。
別の方がリポジトリをクローンした時には、同様に仮想環境を作成・有効化してもらった上で以下のコマンドを実行することで、ファイル出力した仮想環境と同じpythonライブラリが入った環境を再現することができます。
pip install -r requirements.txtまとめ
以上でvenvの説明は終了です。一つのマシンで複数のPython実行環境を構築できるvenvを使い、本体の環境はクリーンな状態を保ちながら開発を行っていきましょう。