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

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

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

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

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

8.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.

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

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