Что такое «подклад пакет пустой»
В Python (а точнее, в его системе управления пакетами pip) под фразой «подклад пакет пустой» обычно понимают заглушку-пакет, состоящую из пустого каталога и минимального набора мета-файлов (__init__.py, pyproject.toml или setup.py). Такой пакет не содержит исполняемого кода, но зарегистрирован в site-packages и может быть установлен через pip install.
Зачем создавать пустой пакет-заглушку
- Резервирование имени в PyPI — чтобы никто другой не занял «брендовое» имя.
- Форвард-компатибилити: старый пакет foo может быть заменён на пустой, который «перенаправляет» зависимость на новый foo-new.
- Этапная миграция — временное решение при разделении монолита на микропакеты.
- Тестирование инфраструктуры: проверка CI/CD-пайплайнов без риска сломать реальный код.
Минимальный пример пустого пакета
Создаём структуру каталогов:
empty_stub/ ├── pyproject.toml ├── src/ │ └── stub_package/ │ └── __init__.py ← пустой └── README.md
pyproject.toml:
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "stub-package"
version = "0.0.1"
description = "Пустой пакет-заглушка"
authors = [{name = "You", email = "you@example.com"}]
dependencies = []
Собираем и публикуем:
$ python -m build $ twine upload dist/*
Как установить и проверить
pip install stub-package- Проверка в REPL:
>>> import stub_package
>>> stub_package.__file__
.../site-packages/stub_package/__init__.py
Расширенные техники
Пакет-перенаправление
Добавляем в __init__.py:
import importlib, sys
sys.modules[__name__] = importlib.import_module('real_package')
После чего import stub_package прозрачно заменится на real_package.
Метаданные для будущих версий
В pyproject.toml можно указать deprecation-warning:
[project]
...
dynamic = ["scripts"]
[tool.setuptools.dynamic]
scripts = {file = "scripts/deprecated_warning.py"}
Распространённые ошибки
- Забыть
__init__.py→ пакет не импортируется. - Загнать в
setup.pyлишние зависимости → «пустой» пакет тянет за собой километры библиотек. - Опубликовать с
version = "0.0.0"— PyPI не позволит заменить на «настоящий» релиз без удаления.
Подклад пакет пустой — это не «пустое место», а мощный инструмент миграции и управления зависимостями. Главное помнить: даже пустой пакет должен быть чистой, документированной и однажды удалённой заглушкой, а не бессмысленным мусором в репозитории.
Удачных вам заглушек и минималистичных __init__.py!