Pythonの.venvとは?プロジェクトごとに作る理由を初心者なりに整理してみた

Pythonの勉強を進める中で、pandasやopenpyxlなどのライブラリをインストールする機会が増えてきました。

そこで疑問に思ったのが、「ライブラリはどこにインストールするのがいいのか」「勉強用の小さなプロジェクトでも、毎回.venvを作る必要があるのか」ということ。

今回は、JupyterLabでPythonを勉強している中で気になった、仮想環境と.venvの役割について整理してみます。

Pythonの勉強を進めていると、pandasやopenpyxlなど、いろいろなライブラリをインストールする機会が増えてきました。

そこで気になったのが、「ライブラリはどこにインストールするのがいいんだろう?」ということ。

調べてみると、Pythonではプロジェクトごとに仮想環境を作り、その中に必要なライブラリをインストールして管理する方法が一般的なようです。

ただ、今私がPythonを使っているのは主に勉強のため。JupyterLabでコードを書いて、一度試したら終わるような小さなプロジェクトも多くあります。

「そんな小さなプロジェクトでも毎回仮想環境を作るべきなの?」と疑問に思ったので、今回はPythonの仮想環境と.venvについて整理してみました。

そもそもvenvとは?

venvは、Pythonの仮想環境を作るための仕組みです。

仮想環境を使うと、プロジェクトごとにPythonの環境を分けて、それぞれで必要なライブラリを管理できます。

例えば、次のようなイメージです。

project-a/
├── .venv/
└── practice.ipynb

project-b/
├── .venv/
└── practice.ipynb

project-aとproject-bにそれぞれ仮想環境があるので、必要なライブラリやそのバージョンが違っていても、別々に管理できます。

venvと.venvは何が違う?

最初はvenv.venvが同じものなのか少し分かりにくかったのですが、厳密には意味が違います。

  • venv:Pythonに標準で用意されている、仮想環境を作るための仕組み
  • .venv:作成した仮想環境を保存するディレクトリにつけることが多い名前

つまり、venvという仕組みを使って、.venvというディレクトリに仮想環境を作る、というイメージです。

なぜプロジェクトごとに仮想環境を作るの?

仮想環境を分ける大きな理由は、プロジェクトごとに必要なライブラリを管理できるからです。

例えば、あるプロジェクトではpandasのあるバージョンを使い、別のプロジェクトでは違うバージョンを使いたい、ということがあるかもしれません。

project-a/
└── .venv/
    └── pandas バージョンA

project-b/
└── .venv/
    └── pandas バージョンB

それぞれ独立した環境になっていれば、一方のライブラリを変更しても、もう一方のプロジェクトには影響しません。

また、PC全体のPython環境にいろいろなライブラリをインストールしていくよりも、「このライブラリはこのプロジェクトで使うもの」と整理しやすくなります。

勉強用の小さなプロジェクトでも毎回.venvを作る?

ここが今回一番気になったところでした。

調べてみると、勉強用の小さなコードを書くたびに、必ず新しい仮想環境を作らなければいけないわけではありません。

例えば、Pythonの勉強全体をひとつのプロジェクトとして、次のように管理することもできます。

python-study/
├── .venv/
├── pandas-practice.ipynb
├── numpy-practice.ipynb
└── openpyxl-practice.ipynb

この場合は、ひとつの.venvを複数の練習ファイルで共有することになります。

一方で、仕事で使うプログラムや、ある程度独立したものを作る場合は、プロジェクトごとに.venvを作っておくと管理しやすそうです。

今回私が作っているものは、一度試してみる程度の小さなプロジェクトなので、必ずしも専用の仮想環境が必要というわけではありません。

ただ、今はPythonを勉強している段階なので、仮想環境を作ること自体にも慣れるため、プロジェクトごとに.venvを作ってみることにしました。

実際に.venvを作ってみる

まず、ターミナルで対象のプロジェクトのディレクトリに移動します。

その状態で、次のコマンドを実行します。

python -m venv .venv

このコマンドでは、Pythonのvenvという機能を使って、現在のディレクトリに.venvという名前の仮想環境を作成しています。

実行すると、プロジェクト内に.venvディレクトリが作成されます。

my-project/
├── .venv/
└── practice.ipynb

.venvを有効化する

仮想環境を作成したら、次のコマンドで有効化します。

source .venv/bin/activate

sourceは、指定したファイルの内容を現在のシェルで実行するためのコマンドです。

ここでは.venv/bin/activateを実行して、先ほど作った仮想環境を有効にしています。

有効化できているか確認したい場合は、次のコマンドを使います。

which python

whichは、現在使われているコマンドがどこにあるのかを確認するコマンドです。

結果が次のように.venv内のPythonを指していれば、仮想環境が使われています。

/プロジェクトまでのパス/.venv/bin/python

必要なライブラリをインストールする

仮想環境を有効にした状態で、必要なライブラリをインストールします。

例えば、pandasとopenpyxlを使う場合は次のようにします。

pip install pandas
pip install openpyxl

pipは、Pythonのライブラリをインストール・管理するためのツールです。

.venvを有効にした状態でpip installを実行すると、ライブラリはその仮想環境内にインストールされます。

これで、PC全体のPython環境ではなく、このプロジェクト用の環境としてライブラリを管理できます。

JupyterLabから.venvを使う

今回はJupyterLabでPythonを勉強しているので、作成した.venvをJupyterLabから使えるようにします。

そのために使うのがipykernelです。

pip install ipykernel

ipykernelは、JupyterでPythonを実行するためのカーネルです。

これを仮想環境にインストールすることで、JupyterLabからその仮想環境のPythonやライブラリを利用できるようになります。

JupyterLabでは、NotebookがどのPython環境を使って実行されるかを「カーネル」で選択します。

そのため、JupyterLabを使っている場合は、Notebookで選択しているカーネルが、作成した.venvの環境になっているか確認することも大切です。

今回理解できたこと

最初は、Pythonのライブラリを一度インストールしておけば、どのプログラムからでも同じものを使えばいいのかなと思っていました。

しかし、仮想環境を使えば、プロジェクトごとにPython環境や必要なライブラリを分けて管理できます。

また、.venvは必ずすべての小さな練習ごとに作らなければいけないものではなく、どこまでをひとつのプロジェクトとして扱うかによって分け方を考えればよいことも分かりました。

今回のような一度試す程度の小さなプロジェクトなら、共通の勉強用環境を使う方法でも問題なさそうです。

ただ、今はまだPythonを勉強している段階なので、しばらくはプロジェクトごとに.venvを作り、仮想環境を作成・有効化してライブラリをインストールする流れにも慣れていこうと思います。