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

building.md

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

1> **Источник:** https://python-all.ru/3.12/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.12/using/cmdline.html#envvar-PYTHONPATH), и её имя должно соответствовать имени модуля с соответствующим расширением. При использовании setuptools правильное имя файла генерируется автоматически.1213Функция инициализации имеет следующую сигнатуру:1415#### `PyObject *PyInit_modulename(void)`1617Функция возвращает либо полностью инициализированный модуль, либо экземпляр [`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).1819Для модулей, имена которых содержат только ASCII, функция должна называться `PyInit_<modulename>`, где `<modulename>` заменяется именем модуля. При использовании [многофазной инициализации](https://python-all.ru/3.12/c-api/module.html#multi-phase-initialization) допускаются имена модулей, не являющиеся ASCII. В этом случае имя функции инициализации – `PyInitU_<modulename>`, где `<modulename>` закодировано с помощью кодировки *punycode* языка Python, причём дефисы заменены символами подчёркивания. В 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.12/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.12/extending/building.html) to learn more about how build and distribute C/C++ extensions with setuptools.35