4. Construire des extensions C et C++

Une extension C pour CPython est une bibliothèque partagée (Un .so sur Linux, un .pyd sur Windows), qui expose une fonction d'initialisation.

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.

La fonction d'initialisation doit avoir le prototype :

PyObject *PyInit_modulename(void)

Elle doit donner soit un module entièrement initialisé, soit une instance de PyModuleDef. Voir Initializing C modules pour plus de détails.

Pour les modules dont les noms sont entièrement en ASCII, la fonction doit être nommée PyInit_<modulename>, dont <modulename> est remplacé par le nom du module. En utilisant Multi-phase initialization, il est possible d'utiliser des noms de modules comptant des caractères non ASCII. Dans ce cas, le nom de la fonction d'initialisation est PyInitU_<modulename>, où modulename est encodé avec l'encodage punyencode de Python, dont les tirets sont remplacés par des tirets-bas. En Python ça donne :

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

Il est possible d'exporter plusieurs modules depuis une seule bibliothèque partagée en définissant plusieurs fonctions d'initialisation. Cependant pour les importer, un lien symbolique doit être créé pour chacun, ou un importer personnalisé, puisque par défaut seule la fonction correspondant au nom du fichier est cherchée. Voir le chapitre "Multiple modules in one library" dans la PEP 489 pour plus d'informations.

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.