4. Створення розширень C і C++

Розширення C для CPython — це спільна бібліотека (наприклад, файл .so у Linux, .pyd у Windows), яка експортує функцію ініціалізації.

To be importable, the shared library must be available on PYTHONPATH, and must be named after the module name, with an appropriate extension. When using setuptools, the correct filename is generated automatically.

Функція ініціалізації має сигнатуру:

PyObject *PyInit_modulename(void)

It returns either a fully initialized module, or a PyModuleDef instance. See Ініціалізація модулів C for details.

Для модулів із іменами лише у форматі 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

Можна експортувати кілька модулів з однієї спільної бібліотеки, визначивши кілька функцій ініціалізації. Однак для їх імпортування потрібно використовувати символічні посилання або спеціальний імпортер, оскільки за замовчуванням знайдено лише функцію, яка відповідає назві файлу. Подробиці див. у розділі «Кілька модулів в одній бібліотеці» у PEP 489.

4.1. 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.