Документация Python неофициальный перевод
Содержание страницы

9. Расширение DistutilsExtending Distutils

Distutils можно расширять разными способами. Большинство расширений представляют собой новые команды или замены существующих. Новые команды могут быть написаны для поддержки новых типов платформенно-зависимой упаковки, например, а замены существующих команд – для изменения деталей работы команды с пакетом.

Большинство расширений distutils делаются в скриптах setup.py, которые хотят изменить существующие команды; многие просто добавляют несколько расширений файлов, которые должны копироваться в пакеты помимо файлов .py для удобства.

Большинство реализаций команд distutils – это подклассы класса distutils.cmd.Command. Новые команды могут напрямую наследовать от Command, а замены часто наследуют от Command косвенно, напрямую создавая подкласс заменяемой команды. Команды обязаны наследовать от Command.

9.1. Интеграция новых командIntegrating new commands

Существуют разные способы интеграции новых реализаций команд в Distutils. Самый сложный – лоббировать включение новых возможностей в сам Distutils и ждать (и требовать) версию Python, которая обеспечивает эту поддержку. Это действительно сложно по многим причинам.

Самый распространенный и, возможно, самый разумный для большинства случаев – включить новые реализации в скрипт setup.py и сделать так, чтобы функция distutils.core.setup() их использовала:

from distutils.command.build_py import build_py as _build_py
from distutils.core import setup

class build_py(_build_py):
    """Специализированный сборщик исходного кода Python."""

    # реализовать то, что должно отличаться...

setup(cmdclass={'build_py': build_py},
      ...)

Этот подход наиболее ценен, если новые реализации необходимо использовать для работы с конкретным пакетом, так как всем, кто интересуется этим пакетом, потребуется иметь реализацию новой команды.

Начиная с Python 2.4, стала доступна третья опция, предназначенная для добавления новых команд, которые могут поддерживать существующие сценарии setup.py без необходимости изменения установки Python. Ожидается, что это позволит сторонним расширениям обеспечивать поддержку дополнительных систем упаковки, но эти команды можно использовать для всего, для чего можно использовать команды distutils. Новая опция конфигурации command_packages (параметр командной строки --command-packages) позволяет указать дополнительные пакеты для поиска модулей, реализующих команды. Как и все опции distutils, её можно задать в командной строке или в файле конфигурации. Эту опцию можно установить только в разделе [global] файла конфигурации, или перед любыми командами в командной строке. Если она задана в файле конфигурации, её можно переопределить из командной строки; установка пустой строки в командной строке приводит к использованию значения по умолчанию. Эта опция никогда не должна быть задана в файле конфигурации, поставляемом с пакетом.

Эта новая опция позволяет добавить любое количество пакетов в список пакетов, в которых ищутся реализации команд; несколько имён пакетов должны разделяться запятыми. Если опция не задана, поиск выполняется только в пакете distutils.command. Однако когда setup.py запускается с опцией --command-packages distcmds,buildcmds, пакеты distutils.command, distcmds и buildcmds будут просматриваться именно в таком порядке. Ожидается, что новые команды будут реализованы в модулях с тем же именем, что и команды, классами, также имеющими то же имя. Для приведённого выше примера опции командной строки команда bdist_openpkg может быть реализована классом distcmds.bdist_openpkg.bdist_openpkg или buildcmds.bdist_openpkg.bdist_openpkg.

9.2. Добавление новых типов дистрибутивовAdding new distribution types

Командам, которые создают дистрибутивы (файлы в каталоге dist/), необходимо добавлять пары (command, filename) в self.distribution.dist_files, чтобы upload мог загрузить их на PyPI. filename в паре не содержит информации о пути, только имя самого файла. В режиме пробного запуска (dry-run) пары всё равно должны добавляться для представления того, что было бы создано.