使用swig 2.0.8和python 3.2,运行
swig -python -modern -py3 -o mymodule_wrap.c mymodule.i
Run Code Online (Sandbox Code Playgroud)
生成一个包装文件,其中包含
# define SWIG_init PyInit__mymodule
Run Code Online (Sandbox Code Playgroud)
在那里(注意 PyInit 和 mymodule 之间的两个下划线)。
导入失败并显示
python3 -c "import mymodule"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: dynamic module does not define init function (PyInit_mymodule)
Run Code Online (Sandbox Code Playgroud)
(注意单下划线)。
手动删除下划线mymodule_wrap.c并重新编译工作模块中的结果。
在这个问题中:SWIG and Python3 Import Error python 解释器抱怨找不到PyInit__module.
怎么了?
确保扩展模块的名称为_mymodule.pydnot mymodule.pyd。
给定一个.i包含声明的 SWIG 文件:
%module mymodule
Run Code Online (Sandbox Code Playgroud)
SWIG 将生成两个文件:
mymodule.pyimport mymodule通过并加载导入到Python中_mymodule.pyd。
mymodule_wrap.c包含一个入口点函数PyInit__mymodule。该源文件必须链接到最终的_mymodule.pyd.
Python 的import <module>语句寻找:
<module>.pyd与入口点PyInit_<module>。<module>.py。对于 SWIG 生成的扩展,import mymodule将加载mymodule.py,这会正确加载_mymodule.pyd并查找PyInit__mymodule.
如果使用了错误的扩展名,import mymodule将错误地加载mymodule.pyd和查找PyInit_mymodule.