nikkie-ftnextの日記

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

Python仮想環境DASH村。シェルのコマンドだけで作ってみる(あくまで学習目的です)

はじめに

作るからこそ、見えるモノ。1 nikkieです。

知的好奇心を満たすために、Pythonのvenvモジュールに頼らず、仮想環境を手作りします。

※これは学習用途なので、実際にはvenvやvirtualenvを頼ってください!

目次

Pythonの仮想環境

Pythonでは、プロジェクトごとに依存ライブラリをインストールする場所(site-packagesディレクトリ)を分けるために仮想環境を使います。
仮想環境は開発者が直接操作する場合もあれば、ラップしてくれているツール(Poetryなど)を使う場合もあります

日々お世話になっている仮想環境なのですが、中身をちょこちょこ覗いているうちに「これ、シェルのコマンドだけで作れるのではないか」と思えてきてしまいました。
とっても気になるので、やってみます!

完了条件は、シェルのコマンドだけで仮想環境(のディレクトリ)を作って、そこにpip installできるとします。

コマンドだけで作る作戦

仮想環境をpython -m venv .venv --upgrade-deps2のように作ると、以下のようにずらっとディレクトリとファイルが作られます(抜粋しています)

.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

今回は絞って作ります

シェルのコマンドだけで作る

私はふだんpyenvPythonを管理し、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-packagespipをインストールするために使っています。
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を読んでみたいな〜


  1. ゼロつく3巻の帯より
  2. このコマンドに込めた意図はこちら
  3. 参考までに