> **Источник:** https://python-all.ru/3.12/extending/building.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 4. Сборка расширений на C и C++

Расширение C для CPython – это разделяемая библиотека (например, файл `.so` в Linux, `.pyd` в Windows), которая экспортирует *функцию инициализации*.

Чтобы библиотеку можно было импортировать, она должна находиться в [`PYTHONPATH`](https://python-all.ru/3.12/using/cmdline.html#envvar-PYTHONPATH), и её имя должно соответствовать имени модуля с соответствующим расширением. При использовании setuptools правильное имя файла генерируется автоматически.

Функция инициализации имеет следующую сигнатуру:

#### `PyObject *PyInit_modulename(void)`

Функция возвращает либо полностью инициализированный модуль, либо экземпляр [`PyModuleDef`](https://python-all.ru/3.12/c-api/module.html#c.PyModuleDef). Подробнее см. в разделе [Инициализация модулей C](https://python-all.ru/3.12/c-api/module.html#initializing-modules).

Для модулей, имена которых содержат только ASCII, функция должна называться `PyInit_<modulename>`, где `<modulename>` заменяется именем модуля. При использовании [многофазной инициализации](https://python-all.ru/3.12/c-api/module.html#multi-phase-initialization) допускаются имена модулей, не являющиеся ASCII. В этом случае имя функции инициализации – `PyInitU_<modulename>`, где `<modulename>` закодировано с помощью кодировки *punycode* языка Python, причём дефисы заменены символами подчёркивания. В Python:

```python
def initfunc_name(name):
    try:
        suffix = b'_' + name.encode('ascii')
    except UnicodeEncodeError:
        suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')
    return b'PyInit' + suffix
```

It 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.12/extending/building.html) for details.

## 4.1. Сборка расширений на C и C++ с помощью setuptools

Python 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.12/extending/building.html) to learn more about how build and distribute C/C++ extensions with setuptools.
