Cython编译C扩展名:ImportError:dynamic模块没有定义init函数
我刚刚使用Cython将C库的一部分作为扩展进行了编译,作为“概念validation”。 我设法破解代码(const纠正问题等),最终得到一个扩展。
但是,当我试图导入新创build的扩展名时,出现以下错误:
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的一个bug /function。 我有同样的事情,但只是补充说:
STUFF = "Hi"
到我的.pyx文件的顶部,问题就消失了。 如果没有全局初始化(一个cinit或设置一个全局variables),就会出现没有生成所需的初始化代码。
这是一个非常晚的答案 – 但我只是有同样的错误,而当我使用__cinit__
而不是__init__
时,我__cinit__
了。 我还在学习扩展types,所以目前我不知道为什么会发生这种情况。 :)(你可以看看http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init )希望这对别人有用。
同样也是一个迟到的答案…但是我一直在特别回答这个问题。 这可能与Dologan解决的不匹配名称问题有关。
在我的情况发生了什么是我正在适应我得到的一个例子工作,并得到该module does not define init function
错误。 这通过使用(例如)
nm -m build / lib.macosx-10.9-x86_64-2.7 / myproj.so
在这个命令的输出中,我search了'init'并find了
000000000000c0d0(__TEXT,__ text)外部__example
我已经从我的setup.py
和.pyx文件中删除了“example”的所有实例,但是即使从site-packages
删除了扩展名,删除了构build文件夹和dist文件夹等等,这仍然存在。我终于发现.cpp文件从我的.pyx文件生成的仍然是在这个例子中的类名。 一旦我reran我的setup.py
,导入工作,实际上.so文件包括
000000000000c0a0(__TEXT,__ text)外部_initmyproj