building.md
1> **Источник:** https://python-all.ru/3.13/extending/building.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 4. Сборка расширений на C и C++89Расширение C для CPython – это разделяемая библиотека (например, файл `.so` в Linux, `.pyd` в Windows), которая экспортирует *функцию инициализации*.1011Чтобы библиотеку можно было импортировать, она должна находиться в [`PYTHONPATH`](https://python-all.ru/3.13/using/cmdline.html#envvar-PYTHONPATH), и её имя должно соответствовать имени модуля с соответствующим расширением. При использовании setuptools правильное имя файла генерируется автоматически.1213Функция инициализации имеет следующую сигнатуру:1415#### `PyObject *PyInit_modulename(void)`1617Функция возвращает либо полностью инициализированный модуль, либо экземпляр [`PyModuleDef`](https://python-all.ru/3.13/c-api/module.html#c.PyModuleDef). Подробнее см. в разделе [Инициализация модулей C](https://python-all.ru/3.13/c-api/module.html#initializing-modules).1819Для модулей с именами, состоящими только из ASCII, функция должна называться `PyInit_<name>`, где `<name>` заменяется на имя модуля. При использовании [многофазной инициализации](https://python-all.ru/3.13/c-api/module.html#multi-phase-initialization) допускаются имена модулей, содержащие символы за пределами ASCII. В этом случае имя функции инициализации – `PyInitU_<name>`, где `<name>` кодируется с помощью *Punycode* (символы дефиса заменяются на подчёркивания). Пример на Python:2021```python22def initfunc_name(name):23 try:24 suffix = b'_' + name.encode('ascii')25 except UnicodeEncodeError:26 suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')27 return b'PyInit' + suffix28```2930It is possible to export multiple modules from a single shared library by defining multiple initialization functions. However, importing them requires using symbolic links or a custom importer, because by default only the function corresponding to the filename is found. See the *“Multiple modules in one library”* section in [**PEP 489**](https://python-all.ru/3.13/extending/building.html) for details.3132## 4.1. Сборка расширений на C и C++ с помощью setuptools3334Python 3.12 and newer no longer come with distutils. Please refer to the `setuptools` documentation at [https://setuptools.readthedocs.io/en/latest/setuptools.html](https://python-all.ru/3.13/extending/building.html) to learn more about how build and distribute C/C++ extensions with setuptools.35