はじめに
ユーフォ3期10話、圧倒的に堂々たる"ユーフォ"だった😭 nikkieです
venvとvirtualenvの関係性をこれまでよりも少しだけ正確に理解できたと思われます
目次
Pythonの仮想環境
このブログでたびたび取り上げている仮想環境。
要はnode_modules
のような依存ライブラリを入れるディレクトリで、Pythonでは開発者がプロジェクトごとに都度作る必要があります
仮想環境を作るツールとして知られているのが
- 標準ライブラリのvenv
- サードパーティのvirtualenv
の2つでしょうか1。
virtualenvが先にあり、人気を受けて標準に入った2
では、virtualenvとvenvの実装は、どのくらい重なっているのでしょうか?
似たような実装がそれぞれで個別にされているんでしょうか。
virtualenvのドキュメントを読む中で、実装の関係性を知りました。
virtualenvはvenvに委譲する
User Guideより
virtualenvは3つの役割で分担して仮想環境を扱うようです。
- Creator
- https://virtualenv.pypa.io/en/latest/user_guide.html#creators
- 仮想環境をセットアップ(Pythonの用意など)
- Seeder
- https://virtualenv.pypa.io/en/latest/user_guide.html#seeders
- seed packagesを仮想環境にインストール(例:pipなど)
- Activator
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()
の中で呼び出すメソッドたちについても言及されています
ensure_directories()
: 仮想環境のディレクトリの作成create_configuration()
: pyvenv.cfg3作成setup_python()
: Pythonへのシンボリックリンク(またはコピー)setup_scripts()
: 有効化スクリプト配置
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を使っています
-
代表例を挙げただけで網羅はしていません。ルーキー uv は
uv venv
で作れたりもします ↩ - スライドのURL https://ftnext.github.io/2024-slides/stapy-april/python-virtual-environment-basic.html#/6/3↩
- 先日、重要さに気づきました ↩