Tengo un proyecto de Python con muchos submódulos que empaqueto 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:Cómo construir una extensión de Python C para poder importarla desde un módulo
Aquí es 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í es 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 yo le gustaría tener c_extension
en vivo en un submódulo, digamos foo.bar
. ¿Qué necesito cambiar en esta tubería para poder obtener el comportamiento en el terminal de Python que ser así:
>>> import foo.bar.c_extension
>>> foo.bar.c_extension.get_answer()
42
Gracias por la respuesta, pero eso no funcionó para mí. Hice el directorio 'foo/bar' con un' __init __. Py' en cada más, agregué el prefijo 'foo.bar' en el comando setup pero en el shell python esto sucede: >>> import foo.bar.c_extension Rastreo (llamada más reciente pasado): archivo "", línea 1, en ImportError: Sin módulo denominado c_extension –
Rich
Y acabo de ver tu edición, he añadido la línea de paquetes también. – Rich
¿Qué versión de Python estás usando? Estoy probando en 2.7.3. – nneonneo