12. Создание пакетов для модулей и приложений Python¶
Наше руководство следует рекомендациям Debian Python policy. В качестве примера мы будем использовать пакет python-markdown, который можно загрузить с сайта PyPI. Вы можете посмотреть исходные коды сборки в репозитории Subversion.
Существует два типа пакетов Python — модули и приложения.
На момент написания руководства, Ubuntu содержала две несовместимых версии Python — 2.x и 3.x. /usr/bin/python является символической ссылкой на версию по умолчанию Python 2.x, а /usr/bin/python3 — на версию по умолчанию Python 3.x. Модули Python нужно собирать со всеми поддерживаемыми версиями Python.
Чтобы создать пакет для нового модуля Python, вам может пригодиться инструмент py2dsc (доступный в пакете python-stdeb).
12.1. debian/control¶
Версии пакетов для Python 2.x и 3.x должны находиться в отдельных двоичных пакетах. Они должны иметь имена в формате python{,3}-имя_модуля (например: python3-dbus.mainloop.qt). В качестве примера в этой статье мы будем использовать для пакетов модуля имена python-markdown и python3-markdown, а также python-markdown-doc для пакета документации.
Специфичные для пакета Python особенности в файле debian/control:
Секция пакетов модуля должна быть python, а для пакета документации doc. Для приложения будет достаточно одного двоичного пакета.
Мы должны добавить зависимости сборки от python-all (>= 2.6.6-3~) и python3-all (>= 3.1.2-7~), чтобы были доступны необходимые скрипты debhelper (подробнее в следующем разделе).
Рекомендуется добавить поля X-Python-Version и X-Python3-Version — подробности смотрите в разделе Policy “Specifying Supported Versions”. Например:
X-Python-Version: >= 2.6 X-Python3-Version: >= 3.1
Если ваш пакет работает только с Python 2.x или 3.x, сборка зависит только от одного пакета -all и использует только одно поле -Version.
Пакеты модулей должны содержать подстановочные переменные {python:Depends} и {python3:Depends} (соответственно) в своих списках зависимостей.
12.2. debian/rules¶
The recommended helpers for python modules are dh_python2 and dh_python3. Unfortunately, debhelper doesn’t yet build Python 3.x packages automatically (see bug 597105 in Debian BTS), so we’ll need to do that manually in override sections (skip this if your package doesn’t support Python 3.x).
Вот наш файл debian/rules (с комментариями):
# These commands build the list of supported Python 3 versions
# The last version should be just “python3” so that the scripts
# get a correct shebang.
# Use just “PYTHON3 := $(shell py3versions -r)” if your package
# doesn’t contain scripts
PY3REQUESTED := $(shell py3versions -r)
PY3DEFAULT := $(shell py3versions -d)
PYTHON3 := $(filter-out $(PY3DEFAULT),$(PY3REQUESTED)) python3
%:
# Adding the required helpers
dh $@ --with python2,python3
override_dh_auto_clean:
dh_auto_clean
rm -rf build/
override_dh_auto_build:
# Build for each Python 3 version
set -ex; for python in $(PYTHON3); do \
$$python setup.py build; \
done
dh_auto_build
override_dh_auto_install:
# The same for install; note the --install-layout=deb option
set -ex; for python in $(PYTHON3); do \
$$python setup.py install --install-layout=deb --root=debian/tmp; \
done
dh_auto_install
It is also a good practice to run tests during the build, if they are shipped by upstream. Usually tests can be invoked using setup.py test or setup.py check.
12.3. debian/*.install¶
Модули Python 2.устанавливаются в каталог /usr/share/pyshared/ и для каждой версии интерпретатора создаётся символическая ссылка в /usr/lib/python2.x/dist-packages/, а все модули для Python 3.x устанавливаются в /usr/lib/python3/dist-packages/.
Если ваш пакет является приложением и имеет собственные модули Python, они должны быть установлены в /usr/share/module или /usr/lib/module, если модули не зависят от архитектуры (например, расширения) (смотрите раздел Policy “Programs Shipping Private Modules”).
Итак, наш файл python-markdown.install будет выглядеть следующим образом (мы также хотим установить исполняемый файл markdown_py):
usr/lib/python2.*/
usr/bin/
а python3-markdown.install будет содержать лишь одну строку:
usr/lib/python3/
12.4. Пакет -doc¶
Инструмент, наиболее часто используемый для сборки документации для приложений на Python — это Sphinx. Чтобы добавить документацию Sphinx к вашему пакету (используя помощник dh_sphinxdoc), вам следует:
Добавьте сборочные зависимости python-sphinx или python3-sphinx (в соответствии с версией Python, которую вы хотите использовать);
Добавьте sphinxdoc к строке dh --with;
- Run setup.py build_sphinx in override_dh_auto_build (sometimes not needed);
Добавьте {sphinxdoc:Depends} в список зависимостей вашего пакета -doc;
Добавьте путь к каталогу сборки документации (обычно build/sphinx/html) в ваш файл .docs.
В нашем случае, документация автоматически собирается в каталоге build/docs/ при запуске setup.py build, так что можно просто указать его в файле python-markdown-doc.docs:
build/docs/
Поскольку документация также содержит исходные файлы``.txt``, нам нужно указать dh_compress не сжимать их — добавив в debian/rules следующее:
override_dh_compress:
dh_compress -X.txt
12.5. Проверка пакета на наличие ошибок¶
Наряду с lintian, есть специальный инструмент для проверки пакетов Python — lintian4py. Он доступен в пакете lintian4python. Например, эти две команды вызывают обе версии lintian и проверяют пакеты исходных кодов и двоичные пакеты:
lintian -EI --pedantic *.dsc *.deb
lintian4py -EI --pedantic *.dsc *.deb
Здесь опция -EI используется для включения экспериментальных и информационных тегов.
12.6. Смотрите также¶
Статью Python/Packaging на вики-страницах Debian;
Статьи Python/LibraryStyleGuide и Python/AppStyleGuide на вики-страницах Debian;
Команды Debian python-modules и python-apps.