Cython编译的C扩展:ImportError:动态模块未定义初始化函数
我刚刚用Cython把我的C库的一部分编译成了一个扩展,算是一个“概念验证”。我费了点劲,解决了一些代码问题(比如常量正确性等),最终成功构建了这个扩展。
不过,当我尝试导入这个新创建的扩展时,出现了以下错误:
ImportError: dynamic module does not define init function
我哪里做错了,应该怎么修复这个问题呢?
我在Ubuntu 10.0.4上使用的是Cython 0.11.2和Python 2.6.5。
9 个回答
2
这个回答有点晚了,不过我刚遇到同样的错误,我用__cinit__
替代了__init__
之后问题就解决了。我现在还在学习扩展类型,所以不太清楚为什么会这样。:)(你可以看看这个链接:http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init)希望这对某些人有帮助。
36
看起来这是Cython中的一个bug或者特性。我也遇到过同样的问题,但我简单地在我的.pyx文件顶部添加了:
STUFF = "Hi"
然后问题就解决了。似乎如果没有全局初始化(比如没有cinit或者没有设置全局变量),那么所需的初始化代码就不会被生成。
77
我发现这个问题常常是因为在用 distutils 设置文件来编译代码时,.pyx 文件的基本名称和扩展名不匹配,比如:
ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work
为了避免这个问题,扩展名应该和基本名称完全一致,在这个例子中,就是 cython_ext
。