我刚刚使用Cython将我的C库的一部分编译为扩展,作为“概念证明”。我设法破解了代码(const纠正问题等),最终建立了扩展。
但是,当我尝试导入新创建的扩展时,出现以下错误:
ImportError: dynamic module does not define init function
我做错了什么以及如何解决这个问题?
我在Ubuntu 10.0.4上使用Cythn 0.11.2和Python 2.6.5
答案 0 :(得分:64)
我发现这个问题的常见原因是,当使用distutils安装文件编译代码时,.pyx基本名称与扩展名不匹配,例如:
ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work
为避免此问题,扩展名应完全相同,在本例中为cython_ext
。
答案 1 :(得分:22)
看起来它是Cython中的一个错误/功能。我有同样的事情,但只是添加:
STUFF = "Hi"
到我的.pyx文件的顶部,问题就消失了。如果没有全局初始化( cinit 或设置全局变量),则会显示未生成所需的初始化代码。
答案 2 :(得分:3)
这是一个非常晚的答案 - 但我遇到了同样的错误,当我使用__cinit__
而不是__init__
时,我的离开了。我还在学习扩展类型,所以目前我不知道为什么会这样。 :)(你可以看看http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init)希望这对某人有用。
答案 3 :(得分:1)
在我的情况下,另一个非常晚的答案我在一个运行python2的终端中意外地调用了cython,同时尝试使用python3从另一个python环境中的终端使用生成的库。
使用相同的python版本到处修复它。
答案 4 :(得分:0)
同样是一个迟到的答案......但我一直在回答这个问题。这可能与Dologan所说的不匹配的名称问题有关。
在我的案例中发生的事情是我正在调整一个我已经开始工作的例子,并得到了module does not define init function
错误。这通过使用(例如)
nm -m build / lib.macosx-10.9-x86_64-2.7 / myproj.so
在这个命令的输出中,我搜索了'init'并找到了
000000000000c0d0(__TEXT,__ text)external _initexample
我已从setup.py
和.pyx文件中删除了所有“示例”实例,但即使从site-packages
删除扩展名,删除了build和dist文件夹等,这仍然存在。我终于发现从我的.pyx文件生成的.cpp文件仍然是指示例中的类名。一旦我重新使用setup.py
,导入工作,实际上.so文件包括
000000000000c0a0(__TEXT,__ text)external _initmyproj
答案 5 :(得分:0)
通过在函数中添加doc字符串来解决这个问题。
答案 6 :(得分:0)
我遇到了同样的错误,并通过在“在专用控制台中执行”模式下运行主要的.py脚本来解决。在工具-首选项-运行中可用。
答案 7 :(得分:0)
我通过
解决def cinit(self): pass
希望有帮助。
答案 8 :(得分:0)
我也遇到过这个问题。确保您的 Cython 文件至少包含以下内容之一:
def
cdef class
)a=None
或记录器加载否则 Cython 不会生成加载模块所需的 PyInit
例程,因此 Python 将无法导入该模块。