venvで複数のPython環境を管理する

## はじめに

この記事は、普段からバリバリPythonでプログラムを書いている方向けではなく、趣味等で、時々Pythonプログラムを読み書きすることがある方のために書きました。

自分のPCでPythonプログラミングをしていると、プロジェクト（ここではソースコードプロジェクト、開発単位としてのプロジェクトを指しています）毎に、依存パッケージを管理したくなってくるはずです。

プロジェクトごとに依存パッケージを管理しておかないと、あるプロジェクト用にパッケージを更新したら、他のプロジェクトのプログラムが正常に動かなくなる等、環境依存の問題に悩まされるかもしれません。そして残念ながら、このリスクは高確率で現実のものとなります。

そんなときに便利なのがvenvです。純粋にPythonに特化したパッケージの依存関係を管理したいなら、まずはvenvを使うのが最短の解決策です。

## venvとは

venvとは軽量な仮想環境作成ツールです。Python3.3以降に標準搭載されています。
つまり、3rd Partyの仮想環境ツールのように、追加でインストールしたり個別にメンテナンスする必要がなく、すべてのPython開発者が簡単に利用できます。

## venvの使い方

それではvenvの使い方をご紹介します。

### 前提

Pythonのバージョンが3.3以上であることを確認してください。

```bash
$ python3 --version
Python 3.11.2
```

なお、この記事を執筆するにあたり、筆者は ChromebookのLinux開発環境を使っていますが、ところどころで他のOSについても補記します。

### ソースプロジェクトに仮想環境を作る

任意のディレクトリで以下を実行します。

<i>python3 -m venv 仮想環境を作りたいソースプロジェクトのパス名</i>

ディレクトリは、myvenvなど任意の名称でOKです。

```bash
# 実行例
$ python3 -m venv ./sample-virtual01
```
コマンドを実行すると、対象のソースプロジェクトのディレクトリ及び仮想環境用の設定ファイル、スクリプト用のサブディレクトリ等が自動で作られます。

```bash
sample-virtual01/
├── bin/（MacOS/Linux）または Scripts¥（Windows）
│   ├── activate            # 仮想環境を有効化するスクリプト
│   ├── activate.bat        # Windows用の有効化スクリプト
│   ├── activate.fish       # Fish shell用の有効化スクリプト
│   ├── activate.csh        # Csh用の有効化スクリプト
│   ├── activate.ps1        # PowerShell用の有効化スクリプト
│   ├── deactivate          # 仮想環境を無効化するスクリプト
│   ├── pip                 # 仮想環境用のpip
│   ├── python             # 仮想環境用のPythonインタプリタ
│   └── python3            # Python3へのシンボリックリンク
│
├── include/               # コンパイル済みヘッダーファイル
│
├── lib/
│   └── pythonX.Y/        # サイトパッケージ（X.Yはバージョン）
│       └── site-packages/ # パッケージがインストールされる場所
│
└── pyvenv.cfg            # 仮想環境の設定ファイル
                         # - homeへのパス
                         # - インタプリタの設定
                         # - バージョン情報
```

自動作成されるファイル/ディレクトリの中で特に重要なものを以下に示します。
- activate系スクリプト（仮想環境の有効化用）
- pip（パッケージインストール用）
- site-packages（パッケージがインストールされる場所）
- pyvenv.cfg（設定ファイル）


既存のPythonプロジェクトに仮想環境を追加することもできます。
また、既存のPythonプロジェクトのディレクトリに移動（Change Directory(以降cd)）した後、python3 -m venv .venv のように先頭がピリオドのディレクトリ名を指定すると、仮想環境関連のディレクトリを隠しディレクトリにすることができます。


### 仮想環境を始動する

venv仮想環境を始動する（アクティベートする）には、対象のソースプロジェクトのディレクトリにcdして、activate用のコマンドを実行します。アクティベート後は、pip installでインストールしたパッケージはグローバルではなく、この仮想環境のみにインストールされます。


#### MacOS/Linux
```bash
# 実行例
source bin/activate
```

#### Windows
```sh
# 実行例
Scripts¥activate
```

アクティベート中は、ターミナルのプロンプトの先頭に (venv仮想環境名) が表示されます。
そのため、仮想環境が始動中か？、どの仮想環境が始動しているのか？ を識別できます。


### 仮想環境を停止する

venv仮想環境の使用を止める（ディアクティベートする）には、deactivateコマンドを実行します。
アクティベートは、アクティベート用のコマンドをパス指定で実行する必要がありますが、ディアクティベートは単に deactivate と実行するだけです。

```bash
$ deactivate
```

### 仮想環境を削除する

venv仮想環境が不要になったら、作成したディレクトリごと削除してください。



### 仮想環境を使用中によく使うコマンド

venv仮想環境をアクティベート後によく使うコマンドを記載します。

```bash
# パッケージのインストール
pip install requests

# 依存関係を保存する
# requirements.txt に、このソースプロジェクトが依存するパッケージやバージョンを定義しておくことができますが、現在の環境をもとにrequirements.txtを作成できる pip freeze は便利です。
pip freeze > requirements.txt

# 依存関係を定義する requirements.txt を参照してパッケージをインストールする。
pip install -r requirements.txt
```


## まとめ

この記事では、Pythonに標準搭載されている軽量な仮想環境作成ツール venv を使い始めるために必要な情報をご紹介しました。



参考:
https://docs.python.org/ja/3.13/library/venv.html
https://peps.python.org/pep-0405/