Содержание страницы
4. Сборка расширений на C и C++¶Building C and C++ Extensions
Расширение C для CPython – это разделяемая библиотека (например, файл .so в Linux,
.pyd в Windows), которая экспортирует функцию инициализации.
Чтобы библиотеку можно было импортировать, она должна находиться в PYTHONPATH,
и её имя должно соответствовать имени модуля с соответствующим расширением.
При использовании setuptools правильное имя файла генерируется автоматически.
Функция инициализации имеет следующую сигнатуру:
Функция возвращает либо полностью инициализированный модуль, либо экземпляр PyModuleDef.
Подробнее см. в разделе Инициализация модулей C.
Для модулей, имена которых содержат только ASCII, функция должна называться
PyInit_<modulename>, где <modulename> заменяется именем модуля.
При использовании многофазной инициализации допускаются имена модулей, не являющиеся ASCII.
В этом случае имя функции инициализации –
PyInitU_<modulename>, где <modulename> закодировано с помощью кодировки punycode языка 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 for details.
4.1. Сборка расширений на C и C++ с помощью setuptools¶Building C and C++ Extensions with 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
to learn more about how build and distribute C/C++ extensions with setuptools.