4. Construindo extensões C e C++

Uma extensão C para CPython é uma biblioteca compartilhada (por exemplo, um arquivo .so no Linux, .pyd no Windows), que exporta uma função de inicialização.

Para ser importável, a biblioteca compartilhada deve estar disponível em PYTHONPATH, e deve ser nomeada após o nome do módulo, com uma extensão apropriada. Ao usar setuptools, o nome do arquivo correto é gerado automaticamente.

A função de inicialização tem a assinatura:

PyObject *PyInit_modulename(void)

Ela retorna um módulo totalmente inicializado ou uma instância de PyModuleDef. Veja Inicializando módulos C para detalhes.

For modules with ASCII-only names, the function must be named PyInit_<name>, with <name> replaced by the name of the module. When using Inicialização multifásica, non-ASCII module names are allowed. In this case, the initialization function name is PyInitU_<name>, with <name> encoded using Python’s punycode encoding with hyphens replaced by underscores. In Python:

def nome_func_iniciadora(nome):
    try:
        sufixo = b'_' + nome.encode('ascii')
    except UnicodeEncodeError:
        sufixo = b'U_' + nome.encode('punycode').replace(b'-', b'_')
    return b'PyInit' + sufixo

É possível exportar vários módulos de uma única biblioteca compartilhada, definindo várias funções de inicialização. No entanto, importá-los requer o uso de links simbólicos ou um importador personalizado, porque por padrão apenas a função correspondente ao nome do arquivo é encontrada. Veja a seção “Multiple modules in one library” na PEP 489 para detalhes.

4.1. Construindo extensões C e C ++ com setuptools

O Python 3.12 e mais recente não vêm mais com distutils. Consulte a documentação setuptools em https://setuptools.readthedocs.io/en/latest/setuptools.html para saber mais sobre como construir e distribuir extensões C/C++ com setuptools.