Документация Python неофициальный перевод

building.md

99 строк · 7.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.2/extending/building.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 3. Сборка расширений на C и C++ с помощью distutils89Начиная с Python 1.4, в Unix Python предоставлял специальный make-файл для создания make-файлов для сборки динамически загружаемых расширений и пользовательских интерпретаторов. Начиная с Python 2.0, этот механизм (известный как связанный с Makefile.pre.in и файлами Setup) больше не поддерживается. Сборка пользовательских интерпретаторов использовалась редко, а модули расширения можно собирать с помощью distutils.1011Для сборки модуля расширения с помощью distutils требуется, чтобы distutils был установлен на сборочной машине; он входит в состав Python 2.x и доступен отдельно для Python 1.5. Поскольку distutils также поддерживает создание бинарных пакетов, пользователям не обязательно иметь компилятор и distutils для установки расширения.1213Пакет distutils содержит скрипт-драйвер `setup.py`. Это обычный файл Python, который в самом простом случае может выглядеть так:1415```c16from distutils.core import setup, Extension1718module1 = Extension('demo',19                    sources = ['demo.c'])2021setup (name = 'PackageName',22       version = '1.0',23       description = 'This is a demo package',24       ext_modules = [module1])25```2627Имея файл `setup.py` и файл `demo.c`, выполнение команды2829```c30python setup.py build31```3233скомпилирует `demo.c` и создаст модуль расширения с именем `demo` в каталоге `build`. В зависимости от системы, файл модуля окажется в подкаталоге `build/lib.system` и может иметь имя вроде `demo.so` или `demo.pyd`.3435В `setup.py` все выполнение осуществляется вызовом функции `setup`. Она принимает переменное количество именованных аргументов, из которых в примере выше используется лишь часть. В частности, пример задаёт метаинформацию для сборки пакетов и содержимое пакета. Обычно пакет содержит дополнительные модули, такие как исходные модули Python, документацию, подпакеты и т.д. Подробнее о возможностях distutils можно узнать из документации [*Распространение модулей Python*](https://python-all.ru/3.2/distutils/index.html#distutils-index); в данном разделе рассматривается только сборка модулей-расширений.3637Часто аргументы для `setup()` вычисляют заранее, чтобы лучше структурировать скрипт-драйвер. В примере выше аргумент `ext_modules` для `setup()` представляет собой список модулей-расширений, каждый из которых является экземпляром `Extension`. В примере экземпляр определяет расширение с именем `demo`, которое собирается путём компиляции одного исходного файла `demo.c`.3839Во многих случаях сборка расширения сложнее, поскольку могут потребоваться дополнительные определения препроцессора и библиотеки. Это показано в примере ниже.4041```c42from distutils.core import setup, Extension4344module1 = Extension('demo',45                    define_macros = [('MAJOR_VERSION', '1'),46                                     ('MINOR_VERSION', '0')],47                    include_dirs = ['/usr/local/include'],48                    libraries = ['tcl83'],49                    library_dirs = ['/usr/local/lib'],50                    sources = ['demo.c'])5152setup (name = 'PackageName',53       version = '1.0',54       description = 'This is a demo package',55       author = 'Martin v. Loewis',56       author_email = 'martin@v.loewis.de',57       url = 'http://docs.python.org/extending/building',58       long_description = '''59This is really just a demo package.60''',61       ext_modules = [module1])62```6364В этом примере `setup()` вызывается с дополнительной метаинформацией, что рекомендуется при необходимости сборки дистрибутивных пакетов. Для самого расширения задаются определения препроцессора, каталоги include, каталоги библиотек и библиотеки. В зависимости от компилятора distutils передаёт эту информацию разными способами. Например, в Unix это может привести к следующим командам компиляции:6566```c67gcc -DNDEBUG -g -O3 -Wall -Wstrict-prototypes -fPIC -DMAJOR_VERSION=1 -DMINOR_VERSION=0 -I/usr/local/include -I/usr/local/include/python2.2 -c demo.c -o build/temp.linux-i686-2.2/demo.o6869gcc -shared build/temp.linux-i686-2.2/demo.o -L/usr/local/lib -ltcl83 -o build/lib.linux-i686-2.2/demo.so70```7172Эти строки приведены только для демонстрации; пользователи distutils должны доверять, что distutils правильно формирует вызовы.7374## 3.1. Распространение модулей расширения7576Когда расширение успешно собрано, есть три способа его использовать.7778Конечные пользователи обычно хотят установить модуль; они делают это, выполняя7980```c81python setup.py install82```8384Сопровождающие модуля должны создавать исходные пакеты; для этого они выполняют8586```c87python setup.py sdist88```8990В некоторых случаях в исходный дистрибутив нужно включить дополнительные файлы; это делается с помощью файла `MANIFEST.in`; подробнее см. в документации distutils.9192Если дистрибутив исходного кода был успешно собран, сопровождающие могут также создать бинарные дистрибутивы. В зависимости от платформы, для этого можно использовать одну из следующих команд.9394```c95python setup.py bdist_wininst96python setup.py bdist_rpm97python setup.py bdist_dumb98```99