Расширение 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/distutils/extending.html