Python3で仮想環境(venv)を使おう。
※この記事はUbuntu 16.04、Python3.5を前提として記載しています。
この記事に書いてあること
Pythonが好きだけど
普段は仕事柄、C++(あるいはC)を使うことが多いのですが、スクリプト言語ではPythonが好きです。
理由は・・・なんでしょうね。フィーリングでしょうか。あくまでも一個人の感想に過ぎませんが、とにかく何かちょっとしたものを作る時に、余計なことを考えずに作れる気がします。
ライブラリも充実していて、なおかつ大概のライブラリはpipという標準の*1パッケージマネージャを使って、簡単に組み込むことができます。たとえばgevent*2というネットワーキングライブラリを使いたくなったら、
$ sudo pip3 install gevent
のようにしてインストールすることが可能です。
しかしこの方法ですと、システム全体*3に影響を与えます。具体的には、/usr/local/lib/python3.5/dist-packages/というディレクトリにインストールされます。
お一人様で開発をしている分にはあまり問題にならない*4のですが、例えばサーバー上でアプリケーションfooとbarを動かす場合、foo、bar共通で利用するライブラリのバージョンアップをしたら、fooは動くけどbarは動かなくなった!ということが起こらなくもないです。
仮想環境とは
そこで仮想環境を使おう、ということになります。仮想環境というと何やら難しげですが、ここで述べる仮想環境は「一つのシステム上にありながら、アプリケーションごとに別々のPython実行環境があるように見せかける」という捉え方でよいかと思います。
インストール
$ sudo apt install python3-venv
使い方
アプリケーションfoo用の仮想環境を用意します。
$ python3 -m venv foo
カレントディレクトリ下にfooディレクトリが作成されるので、カレントディレクトリをfooに移します。
$ cd foo
仮想環境に入ります。
$ source bin/activate
これでfoo用の仮想環境に入りました。プロンプトの先頭に(foo)が付いて、foo用の仮想環境にいることを示してくれます。仮想環境から抜ける時は、
$ deactivate
で抜け出せます。
試す
仮想環境に入った状態でpipを使ってライブラリをインストールすれば、その仮想環境上にだけインストールすることが可能です。
$ cd foo $ source bin/activate $ pip3 install gevent
これでfooの仮想環境にのみgeventライブラリがインストールされるはずです。
試しに以下のような適当なコード(foo.py)を書きます。
import gevent print("Hello")
geventをimportしているだけで特に意味はありません。
$ python3 foo.py Hello
インストールされたgeventがきちんと解決できているので、エラーになりません。仮想環境から抜け出した場合はどうでしょうか。
$ deactivate $ python3 foo.py Traceback (most recent call last): File "test.py", line 1, in <module> import gevent ImportError: No module named 'gevent'
geventが仮想環境にしかインストールされていないので、エラーになりました。
このように、実行環境をアプリケーションごとに閉じることが可能です。
なお、仮想環境に入っている状態でpipを使いインストールされたライブラリは、foo/lib/python3.5/site-packagesに入ります。例えば適当にライブラリを組み合わせて作ったツールなどを他の人に渡す場合、fooディレクトリを固めて渡せば、実行時にactivateを実行してもらうだけで済むので、いちいち「このライブラリとこのライブラリをインストールして・・・」みたいなことを伝えずに済むというメリットもあります。
というわけで、積極的に仮想環境を使いましょう。
ちなみにPythonで仮想環境を利用する方法は、調べるといくつか出てくるのですが、この記事を書いている時点ではこれが標準のようです。Python2については他の方法を使うようですが、ここでは省略します。