Cython编译C扩展:ImportError:动态模块没有定义init函数

时间:2011-11-06 02:21:03

标签: python cython python-extensions

我刚刚使用Cython将我的C库的一部分编译为扩展,作为“概念证明”。我设法破解了代码(const纠正问题等),最终建立了扩展。

但是,当我尝试导入新创建的扩展时,出现以下错误:

ImportError: dynamic module does not define init function 

我做错了什么以及如何解决这个问题?

我在Ubuntu 10.0.4上使用Cythn 0.11.2和Python 2.6.5

9 个答案:

答案 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 文件至少包含以下内容之一:

  • 普通的 Python def
  • 一个普通的 Python 类(不是 cdef class
  • 一行 Python 初始化,例如。 a=None 或记录器加载

否则 Cython 不会生成加载模块所需的 PyInit 例程,因此 Python 将无法导入该模块。