🧩 PEP 804: как связать внешние зависимости с вашим пакетным миромЕсли вы собираете Python-пакет с нативными расширениями или завязками на системные библиотеки (zlib, OpenBLAS, компиляторы, ImageMagick и т. п.), вы точно сталкивались с болью: «pip ругнулся, а что именно надо установить — непонятно».
PEP 804 закрывает эту дыру: теперь инструменты понимают внешние зависимости из вашего
pyproject.toml (в формате DepURL из
PEP 725) и умеют карточно их с пакетами целевой экосистемы (Ubuntu, Fedora, Homebrew, conda-forge, Nix, Spack и т. д.). В идеале — даже показывать готовую команду установки.
Сценарий: вы ставите пакет, он не собирается из-за отсутствия
g++ и
zlib. Вместо «гугли сам» вы видите аккуратный список для вашей системы:
sudo apt install g++ zlib1g zlib1g-dev. А если вы предпочитаете conda — получите
mamba install cxx-compiler zlib.
Когда внешние зависимости не формализованы, ломается все подряд:
🟣 Сборка падает: у разных дистрибутивов разные имена одних и тех же пакетов (
zlib1g-dev,
zlib-devel,
libz), а инструкции в README устаревают быстрее, чем хотелось бы.
🟣 Документация зарастает мхом: сложно поддерживать в актуальном состоянии команды для 5–10 экосистем одновременно.
🟣 CI/релизы с задержками: «оно у меня работало» превращается в рулетку — особенно с чужим Docker-образом, или отличной от вашей OS.
🟣 Анализ зависимостей страдает: внешние требования не видны инструментам, отчего ломаются деревья зависимостей и предсказуемость обновлений.
PEP 804 нацелен искоренить эти проблемы. Вместо «надеемся, что пользователь догадается» —
центральный реестр имен + прозрачные сопоставления для конкретных экосистем, поддерживаемые самими экосистемами.
Ниже — минимальный, но рабочий «скелет», который можно взять и внедрить сегодня.Шаг 1. Опишите внешние зависимости в pyproject.tomlРаздел [external] — это ваш чек-лист для системных/не-PyPI зависимостей. Идентификаторы — это DepURL из PEP 725:
dep:generic/... для конкретных библиотек и
dep:virtual/... для «ролей» (например, компилятор C++).
[build-system]
build-backend = "mesonpy"
requires = ["meson-python>=0.13.1", "pybind11>=2.10.4"]
[external]
# Что нужно для сборки (toolchain, заголовки)
build-requires = [
"dep:virtual/compiler/cxx",
]
# Что нужно для линковки/исполнения
host-requires = [
"dep:generic/zlib",
]
Что это дает: любой инструмент, понимающий PEP 804/725, может на входе получить DepURL и на выходе — список пакетов для вашей ОС/менеджера пакетов.
Шаг 2. Валидируйте DepURL-ы локальноПодтяните тул, который умеет читать
[external], валидировать записи и предлагать каноничные идентификаторы. Пример с условным
pyproject-external:
python -m pyproject_external show --validate .Если вы промахнулись (написали
dep:virtual/compiler/cpp вместо
cxx), получите подсказку вида:
Did you mean 'dep:virtual/compiler/cxx'?Шаг 3. Получайте команды установки для вашей платформыТо, ради чего все затевалось. Покажите маппинг под «авто-определенную» экосистему (например,
Ubuntu + apt) или явно выберите нужную (
conda-forge + mamba/pixi):
# Показать внешние зависимости как DepURL
python -m pyproject_external show .
# Показать уже сопоставленные имена пакетов
python -m pyproject_external show --output=mapped .
# Сгенерировать команду установки
python -m pyproject_external show --output=command .
# Пример вывода:
# sudo apt install --yes g++ zlib1g zlib1g-dev python3
Подробнее: PEP 804 — An external dependency registry and name mapping mechanism: peps.python.org/pep-0804/.