Расширение Distutils
Примечание
Данный документ сохраняется только до тех пор, пока документация setuptools на https://setuptools.readthedocs.io/en/latest/setuptools.html самостоятельно не охватывает всю необходимую информацию, которая сейчас в нем содержится.
Distutils можно расширить различными способами. Большинство расширений представляют собой новые команды или замены существующих команд. Новые команды могут быть написаны для поддержки новых типов платформенно-специфичной упаковки, например, в то время как замены существующим командам могут быть сделаны для изменения деталей того, как команда работает с пакетом.
Большинство расширений distutils создаются в setup.py скриптах, которые хотят изменить существующие команды; многие просто добавляют несколько расширений файлов, которые должны быть скопированы в пакеты в дополнение к .py файлам для удобства.
Большинство реализаций команд distutils являются подклассами класса distutils.cmd.Command. Новые команды могут непосредственно наследоваться от Command, в то время как замены часто производятся от Command косвенно, напрямую наследуя от команды, которую они заменяют. Команды обязаны наследоваться от Command.
7.1. Интеграция новых команд
Существуют разные способы интеграции новых реализаций команд в 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):
"""Specialized Python source builder."""
# implement whatever needs to be different...
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.
7.2. Добавление новых типов распределения
Команды, создающие распределения (файлы в каталоге dist/ ), должны добавить (command, filename) пары в self.distribution.dist_files , чтобы команда upload могла загрузить их на PyPI. В паре filename не содержится никакой информации о пути, только само имя файла. В режиме сухой прогона пары все равно должны быть добавлены, чтобы отразить то, что должно было быть создано.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/distutils/extending.html