Расширение 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.10/distutils/extending.html