# 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 policy;

- Статью Python/Packaging на вики-страницах Debian;

- Статьи Python/LibraryStyleGuide и Python/AppStyleGuide на вики-страницах Debian;

- Команды Debian python-modules и python-apps.