Конфигурация пакета Poetry для проекта с подпакетамиPython

Программы на Python
Anonymous
Конфигурация пакета Poetry для проекта с подпакетами

Сообщение Anonymous »

У меня есть проект с двумя компонентами: api_server и калькулятор. Я хочу, чтобы они были подпакетами основного пакета grzes_toolkit. Вот структура репозитория:
grzes_toolkit
├── api_server
│   ├── protos
│   │   └── messages.proto
│   └── python
│   ├── api_server
│   │   ├── __init__.py
│   │   └── server.py
│   └── __init__.py
├── calculator
│   ├── native
│   │   └── calculator.cc
│   └── python
│   ├── calculator
│   │   ├── arithmetic.py
│   │   ├── __init__.py
│   │   └── scientific.py
│   └── __init__.py
└── pyproject.toml

Это содержимое pyproject.toml:
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

[tool.poetry]
name = "grzes_toolkit"
version = "0.0.5"
description = "A toolkit consisting of an API server and a calculator."
authors = ["grzes314 "]
packages = [
{ include = "calculator", from = "calculator/python", to = "grzes_toolkit"},
{ include = "api_server", from = "api_server/python", to = "grzes_toolkit" },
]

[tool.poetry.dependencies]
python = "^3.10"
grpcio = { version = "^1.0", optional=true }
numpy = { version = "^1.20", optional=true }

[tool.poetry.extras]
api_server = ["grpcio"]
calculator = ["numpy"]
all = ["grpcio", "numpy"]

Я могу использовать стихи, чтобы построить колесо.
$ poetry install
$ poetry build
Building grzes_toolkit (0.0.5)
- Building sdist
- Built grzes_toolkit-0.0.5.tar.gz
- Building wheel
- Built grzes_toolkit-0.0.5-py3-none-any.whl
$ unzip -l dist/grzes_toolkit-0.0.5-py3-none-any.whl
Archive: dist/grzes_toolkit-0.0.5-py3-none-any.whl
Length Date Time Name
--------- ---------- ----- ----
0 1980-01-01 00:00 grzes_toolkit/api_server/__init__.py
71 1980-01-01 00:00 grzes_toolkit/api_server/server.py
0 1980-01-01 00:00 grzes_toolkit/calculator/__init__.py
33 1980-01-01 00:00 grzes_toolkit/calculator/arithmetic.py
0 1980-01-01 00:00 grzes_toolkit/calculator/scientific.py
629 1980-01-01 00:00 grzes_toolkit-0.0.5.dist-info/METADATA
88 1980-01-01 00:00 grzes_toolkit-0.0.5.dist-info/WHEEL
677 2016-01-01 00:00 grzes_toolkit-0.0.5.dist-info/RECORD
--------- -------
1498 8 files

Когда я устанавливаю колесо в независимую виртуальную среду, это выглядит так, как будто я успешно упаковал свой проект:
$ source venv/bin/activate
$ pip install grzes_toolkit-0.0.5-py3-none-any.whl[all]
Processing ./grzes_toolkit-0.0.5-py3-none-any.whl (from grzes-toolkit==0.0.5)
Collecting grpcio=1.0 (from grzes-toolkit==0.0.5->grzes-toolkit==0.0.5)
Downloading grpcio-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.9 kB)
Collecting numpy=1.20 (from grzes-toolkit==0.0.5->grzes-toolkit==0.0.5)
Using cached numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)
Downloading grpcio-1.66.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (5.7 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.7/5.7 MB 3.6 MB/s eta 0:00:00
Using cached numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (18.2 MB)
Installing collected packages: numpy, grzes-toolkit, grpcio
Successfully installed grpcio-1.66.1 grzes-toolkit-0.0.5 numpy-1.26.4

$ python -c "import grzes_toolkit"
$ python -c "from grzes_toolkit.calculator.arithmetic import add; print(add(4,5))"
9
$ python -c "from grzes_toolkit.api_server.server import get_intro_string; print(get_intro_string())"
I am grzes_toolkit server

Однако, похоже, проект неправильно установлен в моей поэтической среде:
$ poetry shell
Spawning shell within /home/glos/.cache/pypoetry/virtualenvs/grzes-toolkit-dd-OeUsJ-py3.10
$ pip list
Package Version Editable project location
------------- ------- ----------------------------
grzes_toolkit 0.0.5 /home/glos/dev/grzes_toolkit
pip 24.1
setuptools 70.1.1
$ python -c "import grzes_toolkit"
Traceback (most recent call last):
File "", line 1, in
ModuleNotFoundError: No module named 'grzes_toolkit'

Это делает разработку очень затруднительной. Создание колеса каждый раз, когда я хочу проверить небольшое изменение в коде, доставляет массу хлопот. Кроме того, без правильной установки пакета (в редактируемом режиме!) я не смогу заставить IDE правильно распознавать импорт.
Это ошибка в поэзии? Что-то не так в конфигурации(pyproject.toml и т.д.)?
Я стремлюсь иметь относительно независимые компоненты в одном колесе. Но, может быть, весь этот подход неверен и мне следует подготовить отдельный pyproject.toml для каждого компонента и собрать отдельные колеса? В этом случае можно ли импортировать их обоих следующим образом:
import grzes_toolkit.api_server
import grzes_toolkit.calculator


Подробнее здесь: https://stackoverflow.com/questions/790 ... ubpackages

Вернуться в «Python»