I have just compiled part of my C library as an extension using Cython, as a "proof of concept". I managed to hack the code (const correctnes problems etc aside), to finally get an extension built.
However, when I attempted to import the newly created extension, I got the following error:
ImportError: dynamic module does not define init function
What am I doing wrong and how do I fix this?
I am using Cythn 0.11.2 and Python 2.6.5 on Ubuntu 10.0.4
I've found that a frequent cause of this problem is, when using a distutils setup file to compile the code, that the .pyx base name does not match the extension name, e.g:
ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work
To avoid the problem the extension name should be exactly the same, in this case, cython_ext
.
It appears that it's a bug/feature in Cython. I had the same thing, but simply added:
STUFF = "Hi"
to the top of my .pyx file and the issue went away. It appears if there is no global initialization (a cinit or setting a global variable), that the required initialization code isn't generated.
This is a very late answer - but I just had the same error, and mine went away when I used __cinit__
instead of __init__
. I'm still learing about extension types so currently I do not know why this happens. :) (You can take a look at http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init) Hope this is useful to someone.
Another really late answer in my case I had accidentally called cython in a terminal that was running python2, while trying to use the generated library from a terminal that was on another python environment, using python3.
Using the same python version everywhere fixed it.
Likewise a late answer... but I kept finding my way back to this question in particular. It probably is related to the mismatched names issue that Dologan addresses.
What happened in my case was that I was adapting an example I'd gotten to work, and got the module does not define init function
error. This was verified by using (e.g.)
nm -m build/lib.macosx-10.9-x86_64-2.7/myproj.so
In this command's output I searched for 'init' and found
000000000000c0d0 (__TEXT,__text) external _initexample
I had removed all instances of 'example' from my setup.py
and .pyx file, but this persisted even after removing the extension from site-packages
, removing the build and dist folders, etc. I finally found that the .cpp file being generated from my .pyx file was still referring to the class name in the example. Once I reran my setup.py
, import works, and indeed the .so file includes
000000000000c0a0 (__TEXT,__text) external _initmyproj
I had the same error and was solved by running the main .py script in "Execute in a dedicated console " mode. Available in Tools - Preferences - Run.
This is solved by adding a doc-string to your functions.
来源:https://stackoverflow.com/questions/8024805/cython-compiled-c-extension-importerror-dynamic-module-does-not-define-init-fu