50

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

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

ImportError: dynamic module does not define init function 

我做错了什么,我该如何解决这个问题?

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

4

9 回答 9

74

我发现这个问题的一个常见原因是,当使用 distutils 安装文件编译代码时,.pyx 基本名称与扩展名不匹配,例如:

ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work

为避免该问题,扩展名应完全相同,在本例中为cython_ext.

于 2014-01-29T12:08:46.607 回答
33

看来这是 Cython 中的一个错误/功能。我有同样的事情,但只是补充说:

STUFF = "Hi"

到我的 .pyx 文件的顶部,问题就消失了。如果没有全局初始化(cinit或设置全局变量),则不会生成所需的初始化代码。

于 2012-12-20T16:30:30.820 回答
2

这是一个非常晚的答案 - 但我也遇到了同样的错误,当我使用__cinit__而不是__init__. 我仍在学习扩展类型,所以目前我不知道为什么会发生这种情况。:) (您可以查看http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init)希望这对某人有用。

于 2012-12-03T05:25:17.910 回答
1

在我的情况下,另一个非常晚的答案是我不小心在运行 python2 的终端中调用了 cython,同时尝试使用来自另一个 python 环境中的终端生成的库,使用 python3。

到处使用相同的 python 版本修复它。

于 2018-04-15T19:18:29.693 回答
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) 外部 _initexample

我已经从我的setup.py和 .pyx 文件中删除了所有“示例”实例,但是即使在从 .pyx 文件中删除扩展名site-packages、删除 build 和 dist 文件夹等之后,这种情况仍然存在。我终于发现 .cpp 文件是从我的 .pyx 文件生成的仍然是指示例中的类名。一旦我重新运行我的setup.py, 导入工作,确实 .so 文件包括

000000000000c0a0 (__TEXT,__text) 外部 _initmyproj

于 2014-06-10T21:27:14.613 回答
0

我也遇到过这个问题。确保您的 Cython 文件至少包含以下内容之一:

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

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

于 2020-12-20T18:19:05.423 回答
-1

这可以通过在您的函数中添加一个文档字符串来解决。

于 2018-01-21T09:56:33.827 回答
-1

我遇到了同样的错误,并通过在“在专用控制台中执行”模式下运行主 .py 脚本来解决。在工具 - 首选项 - 运行中可用。

于 2018-11-15T09:39:15.120 回答
-1

我解决它

def cinit(self): pass

希望能帮助到你。

于 2019-11-19T05:17:52.543 回答