Ubuntu logo

Developer

Создание пакетов для модулей и приложений 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).

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} (соответственно) в своих списках зависимостей.

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.

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/

Пакет -doc

The tool most commonly used for building Python docs is Sphinx. To add Sphinx documentation to your package (using dh_sphinxdoc helper), you should:

  • Добавьте сборочные зависимости 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

Проверка пакета на наличие ошибок

Наряду с lintian, есть специальный инструмент для проверки пакетов Python — lintian4py. Он доступен в пакете lintian4python. Например, эти две команды вызывают обе версии lintian и проверяют пакеты исходных кодов и двоичные пакеты:

lintian -EI --pedantic *.dsc *.deb
lintian4py -EI --pedantic *.dsc *.deb

Здесь опция -EI используется для включения экспериментальных и информационных тегов.

Смотрите также