2012-08-23 13 views
16

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 

Respuesta

12

Sólo cambia

Extension('c_extension', ...) 

a

Extension('foo.bar.c_extension', ...) 

Usted Necesitará __init__.py archivos en cada uno de los directorios foo y bar, como de costumbre. Para tener estos empaquetados con el módulo en su setup.py, es necesario añadir

packages = ['foo', 'foo.bar'], 

a su configuración() llama, y ​​que tendrá la estructura de directorios

setup.py 
foo/ 
    __init__.py 
    bar/ 
     __init__.py 

en su directorio de origen.

+0

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

+0

Y acabo de ver tu edición, he añadido la línea de paquetes también. – Rich

+0

¿Qué versión de Python estás usando? Estoy probando en 2.7.3. – nneonneo

Cuestiones relacionadas