2025/2/1 uv workspace 使う
Using workspaces | uv
関連: 2025/2/2 uv + Artifact Registry で publish & install
---.icon
モチベ
AI/ML 系機能開発のときのアプリケーションとのコード共有に課題がある
LLM 呼び出し、学習、実験用コードやデータセットの加工などを分けたい
LLM API 呼び出し・推論部分だけ切り出して publish したい
別々の API マイクロサービスで実行したり
AI/ML 機能開発用リポジトリで色々開発 → アプリケーションから使う部分だけ dist に書き出して使う的なことをしたい
メモ
全てのワークスペースにはルートワークスペースがある
pyproject.toml のトップ
[tool.uv.workspace] 書いて
$ uv init --package ./packages/mod_a
$ uv init --package ./packages/mod_b
それぞれでファイル作る
code:tree
packages/
├── mod_a
│   ├── README.md
│   ├── pyproject.toml
│   └── src
│   └── poku
│   ├── __init__.py
│   └── mod_a
│   ├── __init__.py
│   ├── impl.py
│   └── main.py
└── mod_b
├── README.md
├── pyproject.toml
└── src
└── poku
├── __init__.py
└── mod_b
├── __init__.py
└── impl.py
$ uv build --package poku-mod-b
でビルド、名前は packages/mod_b/pyproject.toml の name で指定
$ uv build --all
でサブパッケージ一通りビルド
サブパッケージ同士依存させてみる
mod_b → mod_a
packages/mod_b で $ uv add poku-mod-a
特に気にせずうまくいく
なんか扱いが特別なのか root の pyproject.toml の index が継承されてうまくいっているのかは知らん
mypy や ruff の設定
ルートでやればいいようにしたい
mypy
Duplicate module named "poku"
Ryeのworkspaceで複数のパッケージを同時に開発している時に、workspaceのルートでmypyを流す(error: Duplicate module named "..."を--explicit-package-basesで解消) - nikkie-ftnextの日記
mypy 的には namespace package で __init__.py 置かないほうが良い?
PEP 420 – Implicit Namespace Packages | peps.python.org
The mypy configuration file - mypy 1.14.1 documentation
おけるようにするのが namespace_packages=true
うーーーん namespace_packages=true しても __init__.py があるディレクトリは上に辿っていく気がする
消したほうがハマりにくそう
これがシンプルかねえ
code:pyproject.toml
tool.mypy
...
explicit_package_bases = true
mypy_path = "src", "packages/mod_a/src", "packages/mod_b/src"
Support glob patterns when configuring mypy_path · Issue 9965 · python/mypy
glob 使えないので列挙するしかない?
ruff は気にせんでもよい
ルールの上書きは workspace member 側でもできるらしいが
vscode
なくてもいけそうか?
別のディレクトリにコピーして新しく開いたら namespace package のモジュール見つからない
ふとした拍子に認識する、何きっかけて認識するのがよくわからん
py.typed
置くなら namespace package ではない root かな
PEP 561 – Distributing and Packaging Type Information | peps.python.org
For namespace packages (see PEP 420), the py.typed file should be in the submodules of the namespace, to avoid conflicts and for clarity.
コンテナから雑に使えるか
uv ないところに COPY してパスとおしてすんなり動くか
まあ最悪これで
PYTHONPATH="/app/src:/app/packages/mod_a/src:/app/packages/mod_b/src:$PYTHONPATH"
distroless から COPY で uv 入れるやつ
Using uv in Docker | uv
code:Dockerfile
FROM python:3.12-slim-bookworm
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
31.4MB の image 引くだけだから apt とかから入れるより速いし楽だな
実行環境では直 python 派だったけど色々便利機能ついとるねえ
ENV UV_COMPILE_BYTECODE=1 とか
packages 以下の workspace member は sync しておくと .venv/lib/python3.n/site-packages/_poku_mod_a.pth が置かれる
site — Site-specific configuration hook — Python 3.13.1 documentation
site-packages に置いてロードパスに追加するためのやつ
build したやつを private な package registry 使わずにシュッと使える?
$ uv add deps/pkg.whl すればよい
py.typed 置いときたいね
pyproject.toml の [tool.uv.sources] に追記される
poku-mod-a = { path = "deps/poku_mod_a-0.1.0-py3-none-any.whl" }
同じバージョンで中身違っていたら Hash mismatch for ... が出る
uv.lock 消せばよいがここだけ無視みたいなのないのかな?
2024/9/13 rye で Artifact Registry の依存を追加する がダルいのであまりやりたくなく小さい依存なら .whl をリポジトリに置けばええやんと思っている
とはいえやりやすくなったのでやってみる → 2025/2/2 uv + Artifact Registry で publish & install
Using uv with FastAPI | uv
こんなんにまでドキュメントページがついてて偉いね...
その他のきになり
[too.uv.sources] で packages 以下のやつ指定する必要あるの?
この部分
code:pyproject.toml
dependencies = "bird-feeder", "tqdm>=4,<5"
tool.uv.sources
bird-feeder = { workspace = true }
→ そうぽい
workspace member に上書きされない限りトップの定義が共有
bird-feeder = { path = "packages/bird-feeder" }
これは path 依存関係
親 package の名前空間共有するやつどうやる?
google.cloud.hogehoge の google.cloud 部分
こういうのは namespace package と呼ぶ
PEP 420 – Implicit Namespace Packages | peps.python.org
名前空間パッケージをパッケージする - Python Packaging User Guide
__init__.py 置かない or 明示する
code:__init__.py
import pkgutil
__path__ = pkgutil.extend_path(__path__, __name__)
module.__path__ で複数出力される
code:print
import poku
>> poku.__path__
'/Users/pokutuna/tmp/2025/02/01.uv.ckV4I3/packages/mod_a/src/poku', '/Users/pokutuna/tmp/2025/02/01.uv.ckV4I3/packages/mod_b/src/poku'
whl と tar.gz どっちもいるの?
whl でいいらしい
cpu platform 依存なものがはいったりしないのか?
pure python wheels と platform wheels がある
pure python は {package}-{version}-py3-none-any.whl でソースコードのみ含む
platform は {package}-{version}-cp39-cp39-macosx_11_0_arm64.whl などで特定アーキ向け
PEP 425 – Compatibility Tags for Built Distributions | peps.python.org
PEP 427 – The Wheel Binary Package Format 1.0 | peps.python.org
あたり
#Python