4. Construyendo extensiones C y C++
***********************************

Una extensión C para CPython es una biblioteca compartida (por
ejemplo, un archivo ".so" en Linux, ".pyd" en Windows), que exporta
una *función de inicialización*.

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 función de inicialización tiene la firma:

PyObject *PyInit_modulename(void)

It returns either a fully initialized module, or a "PyModuleDef"
instance. See Inicializando módulos en C for details.

Para los módulos con nombres solo ASCII, la función debe llamarse
"PyInit_<modulename>", con "<modulename>" reemplazado por el nombre
del módulo. Cuando se usa Inicialización multifase, se permiten
nombres de módulos que no sean ASCII. En este caso, el nombre de la
función de inicialización es "PyInitU_<modulename>", con
"<modulename>" codificado usando la codificación *punycode* de Python
con guiones reemplazados por guiones bajos. En 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

Es posible exportar múltiples módulos desde una única biblioteca
compartida definiendo múltiples funciones de inicialización. Sin
embargo, importarlos requiere el uso de enlaces simbólicos o un
importador personalizado, porque de forma predeterminada solo se
encuentra la función correspondiente al nombre del archivo. Consulte
la sección *"Múltiples módulos en una biblioteca"* en **PEP 489** para
más detalles.


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.
