Extensión C compilada de Cython: ImportError: el módulo dinámico no define la función init


Acabo de compilar parte de mi biblioteca C como una extensión usando Cython, como una "prueba de concepto". Me las arreglé para hackear el código (const correctnes problemas etc aparte), para finalmente conseguir una extensión construida.

Sin embargo, cuando intenté importar la extensión recién creada, obtuve el siguiente error:

ImportError: dynamic module does not define init function 

¿Qué estoy haciendo mal y cómo lo arreglo?

Estoy usando Cythn 0.11.2 y Python 2.6.5 en Ubuntu 10.0.4

Author: Homunculus Reticulli, 2011-11-06

6 answers

He encontrado que una causa frecuente de este problema es, cuando se utiliza un archivo de instalación de distutils para compilar el código, que el .el nombre base de 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.

 61
Author: Dologan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-29 12:08:46

Parece que es un error/característica en Cython. Yo tenía la misma cosa, pero simplemente añadió:

STUFF = "Hi"

A la parte superior de mi.el archivo pyx y el problema desaparecieron. Parece que si no hay inicialización global (un cinit o establecer una variable global), no se genera el código de inicialización requerido.

 18
Author: Tim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-20 16:30:30

Esta es una respuesta muy tardía - pero acabo de tener el mismo error, y el mío se fue cuando usé __cinit__ en lugar de __init__. Todavía estoy aprendiendo sobre los tipos de extensión, por lo 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.

 3
Author: joon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-30 15:37:09

Igualmente una respuesta tardía... pero seguí encontrando mi camino de regreso a esta pregunta en particular. Probablemente esté relacionado con el problema de nombres no coincidentes que aborda Dologan.

Lo que sucedió en mi caso fue que estaba adaptando un ejemplo que había llegado a trabajar, y obtuvo el error module does not define init function. Esto se verificó utilizando (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) externo _initexample

Había eliminado todas las instancias de 'ejemplo' de mi setup.py y .archivo pyx, pero esto persistió incluso después de eliminar la extensión de site-packages, eliminar las carpetas build y dist, etc. Finalmente encontré que el .archivo cpp que se genera desde mi .el archivo pyx todavía se refería al nombre de la clase en el ejemplo. Una vez que vuelva a analizar mi setup.py, la importación funciona, y de hecho el archivo. so incluye

000000000000c0a0 (__TEXT, _ _ text) external _initmyproj

 0
Author: Gertlex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-10 21:27:14

Actualmente estoy aprendiendo Cython con el libro O'Reilly, y me enfrenté al mismo problema. Lo que resolvió el problema para mí 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
 0
Author: GetLastError,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-21 09:56:33

Otra respuesta muy tardía en mi caso había llamado accidentalmente 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.

Usando la misma versión de python en todas partes se arregló.

 0
Author: Cola_Colin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-15 19:18:29