Создание расширений на C и C++
Расширение на C для CPython — это динамическая библиотека (например, файл .so в Linux, .pyd в Windows), которая экспортирует функцию инициализации.
Чтобы библиотеку можно было импортировать, она должна быть доступна в PYTHONPATH и иметь имя, совпадающее с именем модуля, с соответствующим расширением. При использовании setuptools правильное имя файла генерируется автоматически.
Функция инициализации имеет следующую сигнатуру:
-
PyObject *PyInit_modulename(void)
Она возвращает либо полностью инициализированный модуль, либо экземпляр PyModuleDef. Подробнее см. раздел Инициализация модулей C.
Для модулей с именами, состоящими только из символов ASCII, функция должна называться PyInit_<name>, где <name> заменяется именем модуля. При использовании Многоэтапной инициализации допускаются имена модулей, содержащие символы, отличные от ASCII. В этом случае имя функции инициализации — PyInitU_<name>, где <name> закодировано с помощью кодировки Python punycode, а дефисы заменены на символы подчёркивания. В 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
Можно экспортировать несколько модулей из одной динамической библиотеки, определив несколько функций инициализации. Однако для их импорта необходимо использовать символические ссылки или пользовательский импортёр, поскольку по умолчанию находится только функция, соответствующая имени файла. Подробнее см. раздел «Несколько модулей в одной библиотеке» в PEP 489.
4.1. Создание расширений на C и C++ с помощью setuptools
В Python 3.12 и более поздних версиях distutils больше не входит в состав поставки. Подробнее о сборке и распространении расширений на C/C++ с помощью setuptools см. в документации setuptools по адресу https://setuptools.readthedocs.io/en/latest/setuptools.html.
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/extending/building.html