python - example - Extensión Cython compilada C: ImportError: el módulo dinámico no define la función init
cython youtube (6)
Actualmente estoy aprendiendo Cython con el libro O''Reilly, y enfrenté el 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
Acabo de compilar parte de mi biblioteca de C como extensión con Cython, como una "prueba de concepto". Logré hackear el código (const correctnes problems, etc.), para finalmente obtener una extensión.
Sin embargo, cuando intenté importar la extensión recién creada, recibí el siguiente error:
ImportError: dynamic module does not define init function
¿Qué estoy haciendo mal y cómo soluciono esto?
Estoy usando Cythn 0.11.2 y Python 2.6.5 en Ubuntu 10.0.4
De la misma manera, 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 al que había llegado a trabajar, y obtuve que el module does not define init function
error de la module does not define init function
. Esto fue verificado al usar (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
Había 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 era generado a partir de mi archivo .pyx todavía se estaba refiriendo al nombre de la clase en el ejemplo. Una vez que relancé mi setup.py
, la importación funciona, y de hecho el archivo .so incluye
000000000000c0a0 (__TEXT, __ text) external _initmyproj
Descubrí que una causa frecuente de este problema es que, al usar un archivo de configuración de distutils para compilar el código, el nombre 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
.
Esta es una respuesta muy tardía, pero acabo de tener el mismo error, y el mío desapareció cuando utilicé __cinit__
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 a http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init ) Espero que esto sea útil para alguien.
Otra respuesta realmente tardía en mi caso, accidentalmente llamé a cython en un terminal que estaba ejecutando python2, mientras intentaba usar la biblioteca generada desde un terminal que estaba en otro entorno python, usando python3.
Usar la misma versión de Python en todas partes lo solucionó.
Parece que es un error / característica en Cython. Tenía lo mismo, pero simplemente agregué:
STUFF = "Hi"
en la parte superior de mi archivo .pyx y el problema desapareció. Parece que si no hay inicialización global (un cinit o configuración de una variable global), no se genera el código de inicialización requerido.