2011-11-06 10 views
37

Acabo de compilar parte de mi biblioteca C como una extensión usando Cython, como una "prueba de concepto". Logré hackear el código (const correctnes problems, etc.), para finalmente obtener una extensión.Cython compiled C extension: ImportError: el módulo dinámico no define la función init

Sin embargo, cuando traté de importar la extensión de nueva creación, que tiene el siguiente error:

ImportError: dynamic module does not define init function 

¿Qué estoy haciendo mal y cómo puedo solucionar esto?

estoy usando Cythn 0.11.2 y Python 2.6.5 en Ubuntu 10.0.4

+1

Qué línea de comando que utilizó para generar el .c? ¿Cómo lo compilaste? – tito

+0

Todavía tengo que obtener una respuesta en una [Pregunta de Cython] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) con respecto a un error de compilación. Puede ser capaz de ayudar. – Phillip

Respuesta

56

He encontrado que una causa frecuente de este problema es, cuando se utiliza un archivo de configuración distutils para compilar el código, que el nombre de la base .pyx no coincide con el nombre de la extensión, por ejemplo:

ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work 

Para evitar el problema, el nombre de la extensión debe ser exactamente el mismo, en este caso, cython_ext.

+0

Buena llamada. ¿Alguien sabe por qué funciona esto, y por qué un nombre diferente no? – dinkelk

+0

Todavía tengo que obtener una respuesta en una [Pregunta de Cython] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) con respecto a un error de compilación. Puede ser capaz de ayudar. – Phillip

+0

@dologan, muchas gracias por salvarme un día! – q0987

3

Esta es una respuesta muy tarde - pero sólo tenía el mismo error, y la mía se fue cuando yo __cinit__ en lugar de __init__. Todavía estoy aprendiendo acerca de los tipos de extensión, así que actualmente no sé por qué sucede esto. :) (Puedes echar un vistazo al http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init) Espero que esto sea útil para alguien.

+0

Todavía tengo que obtener una respuesta en una [Pregunta de Cython] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) con respecto a un error de compilación. Puede ser capaz de ayudar. – Phillip

16

Parece que es un error/función en Cython. Tenía la misma cosa, sino simplemente añadí:

STUFF = "Hi" 

a la parte superior de mi archivo .pyx y la cuestión fue. Parece que si no hay una inicialización global (cinit o estableciendo una variable global), no se genera el código de inicialización requerido.

+3

Wow. No puedo creer que realmente funcionó, pero solucionó el mismo error en mi biblioteca. – Rick

+0

Esto funcionó para mí también. Para mi incredulidad. – coffeepls

0

Del mismo modo una respuesta tardía ... pero seguí encontrando el camino de regreso a esta pregunta en particular. Probablemente esté relacionado con el problema de nombres no coincidentes a los que se dirige Dologan.

Lo que sucedió en mi caso fue que estaba adaptando un ejemplo que había llegado a trabajar, y obtuve el error module does not define init function. Esto fue verificado mediante el uso de (por ejemplo)

nm -m build/lib.macosx-10.9-x86_64-2.7/myproj.so

En la salida de este comando Busqué 'init' y encontré

000000000000c0d0 (__TEXT,__text) external _initexample

que habían eliminado todas las instancias de 'ejemplo' de mi archivo setup.py y .pyx , pero esto persistió incluso después de eliminar la extensión de site-packages, eliminar las carpetas de compilación y dist, etc. Finalmente encontré que el archivo .cpp que se estaba generando a partir de mi archivo .pyx todavía se estaba refiriendo al nombre de la clase en el ejemplo. Una vez que volvió a ejecutar mis obras setup.py, importación, y de hecho el archivo .so incluye

000000000000c0a0 (__TEXT,__text) external _initmyproj

0

actualmente estoy aprendiendo Cython con el libro de O'Reilly, y se enfrentó al mismo problema. Lo que me solucionó el problema fue agregar un docstring a la función.

Esto no funcionó:

def fib(int n): 
    cdef int i 
    cdef double a=0.0, b=1.0 
    for i in range(n): 
     a, b = a + b, a 
    return a 

Esto funcionó:

def fib(int n): 
    '''Returns the nth Fibonacci number.''' 
    cdef int i 
    cdef double a=0.0, b=1.0 
    for i in range(n): 
     a, b = a + b, a 
    return a 
Cuestiones relacionadas