nikkie-ftnextの日記

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

開発者が .venv という名前の仮想環境を作っていたら、Poetryはそれを使う

Poetryについて Today(※最近) I learnedです

目次

virtualenvsの下に仮想環境を作るPoetry

先日Poetryを導入したDjangoプロジェクトを例にします1
https://github.com/ftnext/django-bad-apps/tree/dd70560bd9f9fb26ec7630d7462f6bf45e8f2959/sql-injection

.
└── sql-injection/
    ├── bad_sql_injection/
    ├── poetry.lock
    └── pyproject.toml

poetry.lockがあるsql-injectionディレクトリでpoetry installを実行すると2、Poetryはvirtualenvsの下に仮想環境を作って管理します。
macOSでの実行ログです。

% poetry --version
Poetry (version 1.8.2)

% poetry install
Creating virtualenv sql-injection-FRKQhDpu-py3.10 in /Users/<ユーザ名>/Library/Caches/pypoetry/virtualenvs

Poetryが管理する仮想環境はpoetry envで確認・操作できます。

% poetry env list
sql-injection-FRKQhDpu-py3.10 (Activated)

% poetry env remove sql-injection-FRKQhDpu-py3.10
Deleted virtualenv: /Users/<ユーザ名>/Library/Caches/pypoetry/virtualenvs/sql-injection-FRKQhDpu-py3.10

削除しておきました。

Poetryは.venvという名前の仮想環境があったら使う

sql-injectionディレクトリに人力で仮想環境を作ってからpoetry installしてみましょう。

% python -V
Python 3.10.9

% python -m venv .venv --upgrade-deps

% poetry install

Poetryは.venvを使ってくれるんです!

% poetry env list
.venv (Activated)

依存が入ったことの確認です

% .venv/bin/pip list
Package           Version
----------------- -------
asgiref           3.8.1
Django            4.2.15
django-environ    0.11.2
pip               24.2
psycopg2          2.9.9
setuptools        72.2.0
sqlparse          0.5.1
typing_extensions 4.12.2

設定項目virtualenvs.in-project

この動きはドキュメントにも記載されていました。

https://python-poetry.org/docs/configuration#virtualenvsin-project

virtualenvs.in-projectのデフォルト値はNoneです。

If not set explicitly, poetry by default will create a virtual environment under {cache-dir}/virtualenvs or use the {project-dir}/.venv directory if one already exists.

(意訳)virtualenvs.in-projectを明示的に設定しない場合、poetryはデフォルトで

  • {cache-dir}/virtualenvsの下に仮想環境を作る
  • または、すでに存在するならば{project-dir}/.venvディレクトリを使う

Today I learnedは、この後者の振る舞いです。

例えば(Poetryに慣れた方は別の方法をとるのかもしれませんが)VS Codepython.defaultInterpreterPathと相性がよさそうに思いました。

感想(終わりにに代えて)

Poetryの実装、気になりますね。

  • .venvがあったらそれを使う
    • 名前が.venv縛りなのは、なんでなんだろう
  • 執筆に当たりvirtualenvsの下の仮想環境を何回か作ってみたが、ランダムな文字列に見える部分は再現した。どうやってるんだろう

意地悪してみたところ、魔法が起きました

% python -m venv .venv --without-pip

% .venv/bin/pip list
zsh: no such file or directory: .venv/bin/pip

% poetry install

インストールできてるううう!!
poetry run pip listで内訳が見られるんですが、いったいぜんたいどうやったのか。
Ryeのような魔法を使ったのかな