paquetes - Cómo construir una extensión Python C para que pueda importarla desde un módulo
python embedded c++ (1)
Tengo un proyecto de Python con muchos submódulos que empaqueté con distutils. Me gustaría construir algunas extensiones de Python en C para vivir en algunos de estos submódulos, pero no entiendo cómo hacer que la extensión de Python viva en un submódulo. Lo que sigue es el ejemplo más simple de lo que estoy buscando:
Aquí está mi extensión de Python c_extension.c
:
#include <Python.h>
static PyObject *
get_answer(PyObject *self, PyObject *args)
{
return Py_BuildValue("i", 42);
}
static PyMethodDef Methods[] = {
{"get_answer", get_answer, METH_VARARGS, "The meaning of life."},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initc_extension(void) {
(void) Py_InitModule("c_extension", Methods);
}
Y aquí hay un setup.py
que funciona:
from distutils.core import setup
from distutils.extension import Extension
setup(name=''c_extension_demo'',
ext_modules = [Extension(''c_extension'', sources = [''c_extension.c''])])
Después de instalar en un virtualenv puedo hacer esto:
>>> import c_extension
>>> c_extension.get_answer()
42
Pero me gustaría tener c_extension
en vivo en un submódulo, digamos foo.bar
. ¿Qué necesito cambiar en esta canalización para poder lograr que el comportamiento en el shell de Python sea así:
>>> import foo.bar.c_extension
>>> foo.bar.c_extension.get_answer()
42
Solo cambio
Extension(''c_extension'', ...)
a
Extension(''foo.bar.c_extension'', ...)
Necesitará los archivos __init__.py
en cada uno de los directorios de foo
y de bar
, como de costumbre. Para tener estos paquetes con el módulo en su setup.py, necesita agregar
packages = [''foo'', ''foo.bar''],
a su llamada de configuración (), y necesitará la estructura del directorio
setup.py
foo/
__init__.py
bar/
__init__.py
en su directorio de origen.