タワ記

気が向いた時にだけ書く、技術メモっぽいもの。

Python3で仮想環境(venv)を使おう。

※この記事はUbuntu 16.04、Python3.5を前提として記載しています。

この記事に書いてあること

  • venvを使って開発するアプリケーションに応じて、実行環境を閉じよう。
  • $ python3 -m venv fooで仮想環境を作るよ。
  • $ cd fooして$ source bin/activeで閉じた環境に入るよ。
  • $ deactivateで戻るよ。
  • ググるPythonの仮想環境について色々と出てくるのだけど、いまいま(2017.12)の時点ではこれが標準っぽいよ。

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については他の方法を使うようですが、ここでは省略します。

*1:Python 3.4以降の場合

*2:What is gevent? — gevent 1.3.0.dev0 documentation

*3:というと少々大袈裟ですが。

*4:なる場合もあるよ!