Pythonに限らず何かを開発する際に、開発環境をプロジェクトごとに管理することは重要です。
環境ごとに必要なライブラリやパッケージを別けておかないと、あるプロジェクトでは動いたプログラムが別なプロジェクトのプラグラムを動かすために導入や削除・アップグレード・ダウングレードしたパッケージのせいで動かなくなることはよくあります。
たとえ、

1つのプロジェクトに完全に集中するから関係ない!
と意気込んでいても、様々な場面で環境を別けた方が良かったと後悔します。
私は実はあまりこのような管理が得意ではないので、次のような場面で実際に苦労してきました。。
正直なところ私も色々なプロジェクトに関わる中で完璧に管理できているかというと全然上手くできていない(めんどくさい)です。。
なので、この記事ではそんな私への自己啓発も込めて、
非常にお手軽な方法として、Pythonの実行環境を例にvenvを使って仮想環境を作る方法をご紹介します。
お急ぎの方へ
次のコマンドを実行すればmyenvという名前で、
venvを使ったPython実行の為の仮想環境を構築/アクティベートできます。
$ python3 -m venv myenv
$ . myenv/bin/activate
ターミナルの先頭に(myenv)と表示されていれば仮想環境がアクティベートされています。
ディアクティベートするには次のコマンドを実行します。
$ deactivate
実行環境
私の実行環境は次の通りです。
- Windows 11
- WSL2(Ubuntu 22.04.3 LTS (GNU/Linux 5.15.167.4-microsoft-standard-WSL2 x86_64))
- Python 3.10.12
今回はWindowsマシン上のUbuntuの中にPythonの仮想環境を構築してみたいと思います。
venvとは
venvは軽量な仮想環境の作成を行うことのできるモジュールです。
仮想環境といえばVirtualBoxやDockerを思い浮かべる方も多いと思いますが、venvはPython実行環境に特化しているのでリソースの消費が少ないので軽量と表現されています。
ということでPythonを使うだけであれば非常に良い選択肢となります。
仮想環境の作成
プロジェクトで使うディレクトリに移動して次のコマンドを実行します。
$ python3 -m venv [仮想環境の名前]
さっそく私の環境で次のコマンドを実行してみます。
$ python3 -m venv myenv
すると次のようなメッセージが出ました。
The virtual environment was not created successfully because ensurepip is not
available. On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.
apt install python3.10-venv
You may need to use sudo with that command. After installing the python3-venv
package, recreate your virtual environment.
Failing command: /home/user/workspace/project_a/myenv/bin/python3
python3-venvが必要らしいです。どうやらWSL環境だと追加でインストールが必要なようです。
ということで、素直に次のコマンドを実行してみます。
$ sudo apt install python3.10-venv
特にエラーなくインストールできたようです。
改めて次のコマンドを実行します。
$ python3 -m venv myenv
$
今回はエラーが出ませんでした。というか何も見た目の変化がありません。。
lsしてみます。
$ ls
myenv
さきほど指定した[仮想環境の名前]のディレクトリが作成されています。
中を見ると何やら色々と入っています。
$ ls myenv
bin include lib lib64 pyvenv.cfg
中身はそれぞれ次のような構成になっているようです。
myenv/
├── bin/ #仮想環境のバイナリファイル
│ ├── activate
│ ├── pip
│ └── python
├── include/ #C拡張モジュールのコンパイルに必要なC言語のヘッダファイル
├── lib/ #Pythonの標準ライブラリ
└── pyvenv.cfg #仮想環境の設定ファイルでPythonのバージョン情報などを記載
実際に中身を見てみると例えば、pyenv.cfgは次のようになっていました。
$ cat myenv/pyvenv.cfg
home = /usr/bin
include-system-site-packages = false
version = 3.10.12
確かにPythonのバージョンが記載されています。
アクティベート
仮想環境をアクティベートするには次のコマンドを実行します。
$ . myenv/bin/activate
このコマンドは先ほど見たフォルダ構成の中のバイナリファイルが格納されているbinディレクト内のactivateを実行しています。
初めに書いている”.”は仮想環境へのパスで、”.”にvenv実行環境がある想定です。
実行に成功すると、次のようにターミナルの先頭にアクティベートされた環境の名前が()付で表示されるようになります。
(myenv) user@PC:~/workspace/project_a$
パッケージのインストール
仮想環境でパッケージを適当にインストールしてみます。
(myenv) user@PC:~/workspace/project_a$ pip install numpy
(~ 中略 ~)
Installing collected packages: numpy
Successfully installed numpy-2.2.2
結果、numpy-2.2.2がインストールされました。
pip listを実行して現在の環境にインストールされているパッケージのリストを確認してみます。
$ pip list
Package Version
---------- -------
numpy 2.2.2
pip 22.0.2
setuptools 59.6.0
仮想環境ではないホスト側の環境ではどうなっているのか確認してみます。
仮想環境のディアクティベートをしてからpip listしてみます。
$ deactivate
$ pip list
Command 'pip' not found, but can be installed with:
sudo apt install python3-pip
私のホスト環境にはpipすらインストールされていなかったので実行に失敗しました。
このようにしてホスト環境とは別にmyenvという仮想環境を構築できました。
他の人に共有する時どうするか
仮想環境の構築をするメリットとして、プロジェクトごとに必要な環境の情報を他人に共有できるということがあります。
「環境起因の問題をなくせます」と書かなかったのはPython実行環境以外の差分で生じる問題はあり得るので、問題が生じた際に少なくともPython実行環境に関する差分は問題がないと判断できます。
さて、
pip listした結果をコピペして都度インストールするのでは大変です。
次のコマンドを実行するとrequirements.txtというテキストファイルに今いる環境にインストール済のパッケージとそのバージョン情報を書きだすことができます。
$ pip freeze > requirements.txt
さきほど、numpyしかインストールしなかったので、寂しいですが、requirements.txtの中身は次のようになります。
$ cat requirements.txt
numpy==2.2.2
このrequirements.txtを受け取った側では次のコマンドを実行してrequirements.txtに記載されたパッケージを一括でインストールできます。
$ pip install -r requirements.txt
なので、自分のコードを開発する時だけでなく、他人のコードを実行するという観点でも仮想環境の構築は重要になります。
仮想環境を作成・アクティベートしてからreruirements.txtをインストールすることで、pip installはほぼ確実に成功するはずです。
venvの仮想化の仕組み
最後にvenvがどのように仮想化しているのかについて触れます。
簡単に言えば、venvで作成した仮想環境内にいる際にPythonを実行すると、[仮想環境の名前]のディレクトリ配下にある情報を参照して実行するようになっています。
さきほど、仮想環境を作成した時に作成されるディレクトリの中を少し見ましたが、Pythonのバージョンやインストールしたパッケージの情報が記載されていました。
通常、仮想環境にいない時はホスト側にある情報を見に行くところを仮想環境として作成したディレクトリ配下の情報を見に行くように変えていると考えれば良さそうです。
このようなことから考えてみると単に使用するパッケージやPythonバージョンの情報をファイルとして管理しただけのようなイメージで、軽量であるというのも納得できます。

仮想環境の作成というより、
実行時に参照するファイルのパスを変えているだけ?
という風にも捉えられます。ということは、次のような疑問が浮かびます。
ということで、実際に先ほどのnumpyインストールをsudo付きでmyenv環境から実行してみたのですが、
$ sudo: pip: command not found
と表示されました。先ほど書いたように、私のホスト環境にはpipは無いので、仮想環境の外に出てしまっていることが分かります。
ということで、
まとめ
今回はPythonの実行環境の仮想化する方法について書いてみました。
個人的には仮想環境の管理はめんどくさく感じてしまうのですが、やはりこれを怠ってしまうとさらにメンドクサイ問題にぶつかってしまいます。
Python実行環境であればvenv使ってかなり簡単に仮想環境の構築・管理ができるので初めの一歩としてもおススメです。
venvは使ったことはあったのですが、仮想環境の中でsudoを使うとホスト側に行ってしまうというのは考えたことが無かったので記事を書く中で中々面白い発見をしたなと思いました。
以上、参考になれば嬉しいです。
コメント