はじめに
作るからこそ、見えるモノ。1 nikkieです。
知的好奇心を満たすために、Pythonのvenvモジュールに頼らず、仮想環境を手作りします。
※これは学習用途なので、実際にはvenvやvirtualenvを頼ってください!
目次
Pythonの仮想環境
Pythonでは、プロジェクトごとに依存ライブラリをインストールする場所(site-packagesディレクトリ)を分けるために仮想環境を使います。
仮想環境は開発者が直接操作する場合もあれば、ラップしてくれているツール(Poetryなど)を使う場合もあります
日々お世話になっている仮想環境なのですが、中身をちょこちょこ覗いているうちに「これ、シェルのコマンドだけで作れるのではないか」と思えてきてしまいました。
とっても気になるので、やってみます!
完了条件は、シェルのコマンドだけで仮想環境(のディレクトリ)を作って、そこにpip install
できるとします。
コマンドだけで作る作戦
仮想環境をpython -m venv .venv --upgrade-deps
2のように作ると、以下のようにずらっとディレクトリとファイルが作られます(抜粋しています)
.venv/ ├── bin/ │ ├── activate │ ├── pip │ ├── pip3 │ ├── pip3.12 │ ├── python -> python3.12 │ ├── python3 -> python3.12 │ └── python3.12 -> /Users/private/.pyenv/versions/3.12.0/bin/python3.12 ├── lib/ │ └── python3.12/ └── pyvenv.cfg
今回は絞って作ります
シェルのコマンドだけで作る
私はふだんpyenvでPythonを管理し、venvを使っています3。
今回は方法を見つけたいので、以下のバージョンを決め打ちにして進めます
% python -V Python 3.11.8
仮想環境practice
を作ります
% practice/bin/python -m pip install httpx Successfully installed anyio-4.4.0 certifi-2024.6.2 h11-0.14.0 httpcore-1.0.5 httpx-0.27.0 idna-3.7 sniffio-1.3.1
インストールできた!!
作るからこそ見えたモノ
作る中で認識したのはpyvenv.cfg
。
venvモジュールで作った仮想環境の中のpyvenv.cfg
を丸パクリしました。
その仕様はPEP 405にあるようです。
(venvが作り、siteやsysconfigが見るファイル、なのかな?)
ensurepipは標準ライブラリにあるのですが、こちらも今回初めて認識。
仮想環境practice
の下のsite-packages
にpip
をインストールするために使っています。
pyvenv.cfg
を配置するまでは、ensurepipはpyenvの方のsite-packagesを見ていました。
なお、venvで作る仮想環境でもensurepipしています。
https://github.com/python/cpython/blob/v3.12.4/Lib/venv/__init__.py#L384-L387
終わりに
python -m venv
せずに、シェルのコマンドで仮想環境を作るDASH村をしました。
- ディレクトリを作ったり、シンボリックリンクを貼ったりするだけでは不十分で、
pyvenv.cfg
が鍵だった pyvenv.cfg
を置いた後は、標準ライブラリのensurepip
で仮想環境にpip
が用意された(それを使って仮想環境にpip install
できた)
いやーめちゃめちゃ面白かったです。
pyvenv.cfg
についてはPEP 405を読んでみたいな〜