我刚刚使用 Cython 将我的 C 库的一部分编译为扩展,作为“概念证明”。我设法破解了代码(除了常量更正问题等),最终构建了一个扩展。
但是,当我尝试导入新创建的扩展时,出现以下错误:
ImportError: dynamic module does not define init function
我做错了什么,我该如何解决这个问题?
我在 Ubuntu 10.0.4 上使用 Cythn 0.11.2 和 Python 2.6.5
我刚刚使用 Cython 将我的 C 库的一部分编译为扩展,作为“概念证明”。我设法破解了代码(除了常量更正问题等),最终构建了一个扩展。
但是,当我尝试导入新创建的扩展时,出现以下错误:
ImportError: dynamic module does not define init function
我做错了什么,我该如何解决这个问题?
我在 Ubuntu 10.0.4 上使用 Cythn 0.11.2 和 Python 2.6.5
我发现这个问题的一个常见原因是,当使用 distutils 安装文件编译代码时,.pyx 基本名称与扩展名不匹配,例如:
ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work
为避免该问题,扩展名应完全相同,在本例中为cython_ext
.
看来这是 Cython 中的一个错误/功能。我有同样的事情,但只是补充说:
STUFF = "Hi"
到我的 .pyx 文件的顶部,问题就消失了。如果没有全局初始化(cinit或设置全局变量),则不会生成所需的初始化代码。
这是一个非常晚的答案 - 但我也遇到了同样的错误,当我使用__cinit__
而不是__init__
. 我仍在学习扩展类型,所以目前我不知道为什么会发生这种情况。:) (您可以查看http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init)希望这对某人有用。
在我的情况下,另一个非常晚的答案是我不小心在运行 python2 的终端中调用了 cython,同时尝试使用来自另一个 python 环境中的终端生成的库,使用 python3。
到处使用相同的 python 版本修复它。
同样是一个迟到的答案......但我一直在寻找回到这个问题的方法。这可能与 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
我也遇到过这个问题。确保您的 Cython 文件至少包含以下内容之一:
def
cdef class
)a=None
或记录器负载否则 Cython 不会生成PyInit
加载模块所需的例程,因此 Python 无法导入该模块。
这可以通过在您的函数中添加一个文档字符串来解决。
我遇到了同样的错误,并通过在“在专用控制台中执行”模式下运行主 .py 脚本来解决。在工具 - 首选项 - 运行中可用。
我解决它
def cinit(self): pass
希望能帮助到你。