nikkie-ftnextの日記

イベントレポートや読書メモを発信

virtualenvはPython標準ライブラリのvenvを使って仮想環境を作っている

はじめに

ユーフォ3期10話、圧倒的に堂々たる"ユーフォ"だった😭 nikkieです

venvとvirtualenvの関係性をこれまでよりも少しだけ正確に理解できたと思われます

目次

Pythonの仮想環境

このブログでたびたび取り上げている仮想環境。
要はnode_modulesのような依存ライブラリを入れるディレクトリで、Pythonでは開発者がプロジェクトごとに都度作る必要があります

仮想環境を作るツールとして知られているのが

の2つでしょうか1

virtualenvが先にあり、人気を受けて標準に入った2

では、virtualenvとvenvの実装は、どのくらい重なっているのでしょうか?
似たような実装がそれぞれで個別にされているんでしょうか。
virtualenvのドキュメントを読む中で、実装の関係性を知りました。

virtualenvはvenvに委譲する

User Guideより

virtualenv.pypa.io

virtualenvは3つの役割で分担して仮想環境を扱うようです。

Creatorには2つのタイプがあるようですが、venvタイプのCreatorについて

venv - this delegates the creation process towards the venv module, as described in PEP 405.

意訳「venvタイプは、作成プロセスを、PEP 405に記載されている、venvモジュールに委譲する」

venv以外にはbuiltinというCreatorがあり、コマンドラインから指定できるようです(が今回はこれ以上掘り下げません)
https://virtualenv.pypa.io/en/latest/cli_interface.html#creator

委譲しているコードは(おそらく)こちら:
https://github.com/pypa/virtualenv/blob/20.26.2/src/virtualenv/create/via_global_ref/venv.py#L60-L69

class Venv(ViaGlobalRefApi):
    def create_inline(self):
        from venv import EnvBuilder  # noqa: PLC0415

        builder = EnvBuilder(
            system_site_packages=self.enable_system_site_package,
            clear=False,
            symlinks=self.symlinks,
            with_pip=False,
        )
        builder.create(str(self.dest))

venvのEnvBuilder

venvのドキュメントの方も見てみましょう。

createメソッドについて
https://docs.python.org/ja/3/library/venv.html#venv.EnvBuilder.create

仮想環境を持つことになるターゲットディレクトリ (絶対パスあるいは現在のディレクトリからの相対パス) を指定し、仮想環境を作成します。

create()の中で呼び出すメソッドたちについても言及されています

virtualenvがvenvに委譲するときのEnvBuilderインスタンス化はwith_pip=Falseなので、pipがインストールされていない仮想環境をvenvに作ってもらっていますね。
pipなどはvirtualenvのSeederで入れる意図でしょう。

終わりに

virtualenvとvenvの関係性を知りました。
virtualenvはCreatorとしてvenvに委譲しています。
仮想環境のディレクトリを作る部分はvenvの実装が使われているということですね。

仮想環境のディレクトリを作った後は、virtualenvはSeederとActivatorで後続処理をしています。
結果としてできる仮想環境に大きな違いはないのかもしれませんが、Creatorでvenvを使うという過程を知れて興味深かったです

この2つはバラバラにできあがっているものではないので、私としてはどちらを使ってもいいという立場です。
私はvirtualenvだけの機能がまだ必要になっていないのでvenvを使っています


  1. 代表例を挙げただけで網羅はしていません。ルーキー uv は uv venv で作れたりもします
  2. スライドのURL https://ftnext.github.io/2024-slides/stapy-april/python-virtual-environment-basic.html#/6/3
  3. 先日、重要さに気づきました