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