extending.md
1> **Источник:** https://python-all.ru/3.4/distutils/extending.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8. Расширение Distutils89Distutils можно расширять разными способами. Большинство расширений представляют собой новые команды или замены существующих. Новые команды могут быть написаны для поддержки новых типов платформенно-зависимой упаковки, например, а замены существующих команд – для изменения деталей работы команды с пакетом.1011Большинство расширений distutils делаются в скриптах `setup.py`, которые хотят изменить существующие команды; многие просто добавляют несколько расширений файлов, которые должны копироваться в пакеты помимо файлов `.py` для удобства.1213Большинство реализаций команд distutils – это подклассы класса [`distutils.cmd.Command`](https://python-all.ru/3.4/distutils/apiref.html#distutils.cmd.Command). Новые команды могут напрямую наследовать от `Command`, а замены часто наследуют от `Command` косвенно, напрямую создавая подкласс заменяемой команды. Команды обязаны наследовать от `Command`.1415## 8.1. Интеграция новых команд1617Существуют разные способы интеграции новых реализаций команд в Distutils. Самый сложный – лоббировать включение новых возможностей в сам Distutils и ждать (и требовать) версию Python, которая обеспечивает эту поддержку. Это действительно сложно по многим причинам.1819Самый распространенный и, возможно, самый разумный для большинства случаев – включить новые реализации в скрипт `setup.py` и сделать так, чтобы функция [`distutils.core.setup()`](https://python-all.ru/3.4/distutils/apiref.html#distutils.core.setup) их использовала:2021```python22from distutils.command.build_py import build_py as _build_py23from distutils.core import setup2425class build_py(_build_py):26 """Специализированный сборщик исходного кода Python."""2728 # реализовать то, что должно отличаться...2930setup(cmdclass={'build_py': build_py},31 ...)32```3334Этот подход наиболее ценен, если новые реализации необходимо использовать для работы с конкретным пакетом, так как всем, кто интересуется этим пакетом, потребуется иметь реализацию новой команды.3536Начиная с Python 2.4, доступна третья опция, предназначенная для добавления новых команд, которые могут поддерживать существующие скрипты `setup.py` без необходимости модификации установки Python. Ожидается, что это позволит сторонним расширениям обеспечивать поддержку дополнительных систем упаковки, но команды могут использоваться для любых целей, для которых могут использоваться команды distutils. Новая опция конфигурации `command_packages` (опция командной строки *--command-packages*) может использоваться для указания дополнительных пакетов, в которых следует искать модули, реализующие команды. Как и все опции distutils, её можно указать в командной строке или в файле конфигурации. Эта опция может быть установлена только в разделе `[global]` файла конфигурации или перед любыми командами в командной строке. Если она установлена в файле конфигурации, её можно переопределить из командной строки; установка пустой строки в командной строке приводит к использованию значения по умолчанию. Эту опцию никогда не следует устанавливать в файле конфигурации, поставляемом вместе с пакетом.3738Эту новую опцию можно использовать для добавления любого количества пакетов в список пакетов, в которых ищутся реализации команд; несколько имен пакетов должны разделяться запятыми. Если не указано, поиск выполняется только в пакете [`distutils.command`](https://python-all.ru/3.4/distutils/apiref.html#module-distutils.command). Однако когда `setup.py` запускается с опцией `--command-packages distcmds,buildcmds`, пакеты [`distutils.command`](https://python-all.ru/3.4/distutils/apiref.html#module-distutils.command), `distcmds` и `buildcmds` будут проверяться в этом порядке. Ожидается, что новые команды будут реализованы в модулях с тем же именем, что и команда, классами с тем же именем. Для приведенного выше примера опции командной строки команда **bdist\_openpkg** может быть реализована классом `distcmds.bdist_openpkg.bdist_openpkg` или `buildcmds.bdist_openpkg.bdist_openpkg`.3940## 8.2. Добавление новых типов дистрибутивов4142Командам, которые создают дистрибутивы (файлы в каталоге `dist/`), необходимо добавлять пары `(command, filename)` в `self.distribution.dist_files`, чтобы **upload** мог загрузить их на PyPI. *filename* в паре не содержит информации о пути, только имя самого файла. В режиме пробного запуска (dry-run) пары всё равно должны добавляться для представления того, что было бы создано.43