extending.md
1> **Источник:** https://python-all.ru/3.5/distutils/extending.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8. Расширение Distutils89Distutils можно расширять разными способами. Большинство расширений представляют собой новые команды или замены существующих. Новые команды могут быть написаны для поддержки новых типов платформенно-зависимой упаковки, например, а замены существующих команд – для изменения деталей работы команды с пакетом.1011Большинство расширений дистрибутивов делаются в скриптах `setup.py`, которые хотят изменить существующие команды; многие просто добавляют несколько расширений файлов, которые следует копировать в пакеты в дополнение к файлам `.py` для удобства.1213Большинство реализаций команд дистрибутивов являются подклассами класса [`distutils.cmd.Command`](https://python-all.ru/3.5/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.5/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.5/distutils/apiref.html#module-distutils.command). Однако при запуске `setup.py` с опцией `--command-packages distcmds,buildcmds` пакеты [`distutils.command`](https://python-all.ru/3.5/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* в паре не содержит информации о пути, только имя самого файла. В режиме пробного прогона пары всё равно должны добавляться для представления того, что было бы создано.43