いものやま。

雑多な知識の寄せ集め

もうPythonで迷わないために。(その2)

前回はどのPythonを使うべきか書いた。

今日はPythonの仮想環境について。

Pythonの仮想環境について

単に「仮想環境」といった場合、たとえば古くはVMWareVirtualBox、あるいはQEMU、最近だとDockerのように、ホストOSの上にゲストOSを載せ、まるで独立した環境であるかのように見せる技術のことをいうことが多い。

ただ、Pythonの仮想環境といった場合、上記とは少し違ってくる。

Pythonの仮想環境では、仮想環境ごとに独立したPythonの実行環境を用意できて、仮想環境を切り替えることで、Pythonのバージョンやインストールされたライブラリ、そのバージョンを切り替えることができる。 たとえば、仮想環境1ではPython3.6を使ってTensorFlowの1系を使用し、仮想環境2では同じPython3.6を使うけどTensorFlowを2系を使用、仮想環境3ではPython3.9を使ってTensorFlowの2系を使用するといったことができる。

なんでそんなことをするかというと、まず大前提として、Pythonは仮想環境なしだと同名のライブラリは1つのバージョンしか入れられないから。なので、あるプロジェクトではこのバージョン、別のプロジェクトでは別のバージョンといった使い分けができない。 さらに、ライブラリ間には依存関係があって、場合によっては特定のバージョンの組み合わせでしか動作しないということもある。 そこで、仮想環境を用意して、仮想環境ごとにライブラリをインストールするようにすれば、仮想環境を切り替えることで使うライブラリのバージョンを変えることができるし、依存関係の問題も最小限に抑えることができる。

まぁ、RubyのBundlerを知ってる身からすると、なんて頭が悪いデザインで無駄なディスクの使い方するんだろうというのが正直なところだけど・・・シンプルな仕組みで実現できているという意味ではいいのかもしれない。

何はともあれ、何かと厄介なライブラリ周りの問題を避けるためにも、仮想環境を使った方がいい。

どの仮想環境ライブラリを使うべきか?

さて、そこで問題になるのが、「どの仮想環境ライブラリを使うべきか?」という問題。 どのPythonを使うべきかという問題に続き「またか」ってウンザリすると思うんだけど、仕方ない。

実際、関連するライブラリがいろいろあって、pyenvとかvirtualenv、pipenvとか、Anacondaのconda、そしてそれらをどう組み合わせて使うのとか、もうカオスだった。

ただ、それも昔の話で、今はvenv一択。

  • 公式のライブラリ
  • 最初から入ってるのでインストール不要
  • Pythonのバージョンの切り替えもインストールされたライブラリの切り替えもできる
  • 扱いが簡単

venvの使い方

venvで仮想環境を作るには、使いたいバージョンのPythonでモジュールにvenvを指定し、引数として仮想環境名を与えて実行すればいい。

たとえばPython3.9でpy39という名前の仮想環境を作りたい場合、以下のようにする:

$ python3.9 -m venv py39

こうすると、py39というディレクトリが作られ、その中に仮想環境に必要なファイルが置かれる。 (インストールしたライブラリなどもこの中に置かれる)

仮想環境を作っただけだとまだこの仮想環境は使われなくて、有効化(アクティベーション)することでこの仮想環境が使われるようになる。 有効化するには作った仮想環境の下にあるbin/activateを現在のシェルで実行する。

たとえば上記の仮想環境を有効にするには、以下のようにする:

$ source py39/bin/activate

こうするとプロンプトの前に(py39)という仮想環境名がつき、pythonコマンドでPython3.9が起動するようになって、この仮想環境にインストールされたライブラリが使用されるようになる:

(py39) $ python --version
Python 3.9.4

有効になっている仮想環境を無効化(デアクティベート)するには、deactivateコマンドを実行すればいい:

(py39) $ deactivate

ちなみに、いらなくなった仮想環境はディレクトリごと削除すればいい。

仮想環境は何個用意すべき?

あとは仮想環境を何個用意すべきかという問題。 できるだけ分かれていた方が問題は起こりにくいけど、かといって何個も作ってしまうとディスク容量も食うし、散らばってしまうと厄介。

これについては、汎用的な仮想環境を1つ、そしてプロジェクトごとに専用の仮想環境を1つずつ用意するといい。

汎用的な仮想環境は、開発環境として使うJupyterLabを動かすのや、簡単なスクリプトを動かすのに使う。

一方、プロジェクトごとの仮想環境はプロジェクトのディレクトリの下に作り、そのプロジェクト専用で使う。

こうすることで、普段は気楽に使いつつ、それぞれのプロジェクトでは独立した環境で作業できるので問題が起きにくくなる。


今日の内容をまとめると、以下:

  • Pythonの仮想環境を使うようにする
  • 公式のvenvを使う
  • 使い方は以下:
    • 仮想環境を作るには$ <使いたいバージョンのPython> -m venv <仮想環境名>
    • 仮想環境を有効化するには$ source <仮想環境のディレクトリ>/bin/activate
    • 仮想環境を無効化するには$ deactivate
  • 汎用的な仮想環境を1つ、プロジェクトごとに仮想環境を1つずつ、用意するといい

今日はここまで!