4. Создание расширений на языках C и C++

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

Чтобы импортировать библиотеку, она должна быть доступна на PYTHONPATH и должна быть названа именем модуля с соответствующим расширением. При использовании setuptools правильное имя файла генерируется автоматически.

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

PyObject *PyInit_modulename(void)

Он возвращает либо полностью инициализированный модуль, либо экземпляр PyModuleDef. Подробности см. в разделе Инициализация модулей C.

Для модулей с именами только ASCII функция должна иметь имя PyInit_<modulename>, а <modulename> заменяется именем модуля. При использовании Многофазная инициализация допускаются не ASCII-имена модулей. В этом случае имя функции инициализации будет PyInitU_<modulename>, а <modulename> закодировано с помощью кодировки 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. Пожалуйста, обратитесь к документации setuptools по адресу https://setuptools.readthedocs.io/en/latest/setuptools.html, чтобы узнать больше о том, как собирать и распространять расширения C/C++ с помощью setuptools.