Упаковка и публикация пакетов
Превратите папку с модулями в устанавливаемый, версионированный пакет на PyPI, которым можно делиться
pyproject.toml. Из него бэкенд сборки создаёт два артефакта: исходный дистрибутив (sdist) и собранный wheel. Вы загружаете их в Python Package Index (PyPI) с помощью twine, и после этого любой может выполнить pip install ваш-пакет. Здесь нет никакой магии - только метаданные, шаг сборки и загрузка.
- разложить проект по src-раскладке и понять, почему она предотвращает целый класс ошибок,
- написать полный
pyproject.toml:[build-system], метаданные[project], зависимости, необязательные extras и консольные точки входа, - создавать и использовать изолированное виртуальное окружение для разработки,
- собрать
sdistиwheelс помощьюpython -m buildи объяснить разницу, - выбрать версию по семантическому версионированию и держать единый источник истины,
- публиковать сначала на TestPyPI, а затем на PyPI с API-токеном и
twine.
1. Какую задачу решает упаковка
Вы уже умеете разбивать код на модули и пакеты (папки с __init__.py) и импортировать их. На вашей машине это работает, потому что текущий каталог находится в sys.path. Но как только код понадобится кому-то ещё, неформальный обмен даёт сбой: какие файлы нужны, какие сторонние библиотеки надо установить заранее, какая версия Python требуется и как import yourlib разрешится на чужой машине?
Упаковка отвечает на всё это декларативно. Вы описываете проект один раз, инструмент сборки создаёт стандартный артефакт, а pip берёт на себя установку в любое окружение - копирует файлы в site-packages и подтягивает объявленные зависимости. Читателю не нужно ничего угадывать; метаданные авторитетны.
Исторически эти метаданные жили в исполняемом скрипте setup.py. Запускать произвольный код только для того, чтобы прочитать имя проекта, было хрупко и небезопасно, поэтому экосистема перешла к декларативному стандарту. PEP 518 ввёл pyproject.toml, а PEP 621 стандартизировал таблицу [project]. Сегодня pyproject.toml - единственный нужный файл; setup.py и setup.cfg устарели.