2019-01-24
Начнём с теории, а уже потом перейдём к практике.
Стандарт Wheel (описан в PEP-427) в 2012-ом году пришёл на замену Egg, и с тех пор стал самым популярным форматом для распространения готовых пакетов.
Говоря простым языком, wheel-пакет - это ZIP-архив, с расширением .whl, в который упаковано всё, что необходимо для работы приложения или библиотеки на языке Python. Достаточно извлечь все файлы, которые хранятся внутри этого .whl-архива с помощью стандартного архиватора и можно работать с привычными .py файлами и ресурсами для них.
Естественно, в большинстве случаев требуется установка зависимостей, или какая-то иная работа в конечном окружение. Для этого в менеджер зависимостей pip была добавлена поддержка wheel-пакетов.
При вызове следующей команды:
pip install requests
pip сделает следующее:
*.whl-файл (учтя платформу и архитектуру системы).py в платформо-зависимые .pycЗа выполнение большей части работы по установке библиотеки отвечает пакет setuptools.
Настройки, необходимые для установки пакета, хранятся в двух файлах:
setup.py - содержит функции и параметры необходимые для установки пакета
setup.cfg - хранит значения по умолчанию для аргументов команд объявленных в setup.py
Как можно видеть из примера, setup.py представляет собой довольно объёмный файл и не всегда очевидно, какими значениями нужно инициализировать указанные в нём параметры.
Кроме вышеописанных файлов, wheel-пакет может включать в себя дополнительные ресурсы: ChangeLog (список изменений в проекте), файл AUTHORS, подробное описание пакета и тд.
Для снижения объёма "ручной" работы при подготовке wheel-пакета, разработчики из OpenStack подготовили специализированный инструмент - PBR (Python Build Reasonableness). PBR выполняют следующую работу:
AUTHORS на основание git-логаChangeLog на основание git-логаmanifest на основание файлов в папке .git и нескольких стандартных файлов requirements.txtREADME для заполнения параметра long_descriptionSphinx Autodoc файлы для всего модуляВся прелесть работы с PBR заключается в простоте его использования.
Для сборки пакета необходимо создать файлы setup.py и setup.cfg в корневой директории проекта.
Пример setup.py (можно использовать без изменений):
#!/usr/bin/env python
from setuptools import setup
setup(
setup_requires=['pbr'],
pbr=True,
)
Пример setup.cfg:
[metadata]
name = project-name
[files]
packages = project-name
[entry_points]
console_scripts =
script-name = python.module:main
Следующие атрибуты файла setup.cfg нужно привести в соответствие с вашими проектом:
main, расположенной в модуле по пути package/subpackage/module.pyСборку проекта можно запустить, вызвав команду:
python setup.py bdist_wheel
Результатом выполнения команды будет файл с расширением *.whl в директории ./dist/. Например: ./dist/project-name-0.0.1.dev195-py3-none-any.whl
Можно установить этот wheel-пакет, просто скопировав его на нужный компьютер, и запустить pip install, передав путь до файла.
Например:
pip install ./dist/project-name-0.0.1.dev195-py3-none-any.whl
После установки wheel-пакета в систему, можно будет вызвать команду, которую мы объявили в setup.cfg:
script-name
Это приведёт к запуску функции main из package.subpackage.module.
Выше описанный сценарий использования PBR может помочь при сборке Docker-образов и публикации пакетов на внутренний или основной PyPI.
Если вас заинтересовала тема затронутая в этой статье, рекомендую ознакомиться со следующими материалами: