使用 swig 2.0.8 和 python 3.2,运行
swig -python -modern -py3 -o mymodule_wrap.c mymodule.i
产生一个包装文件,它有
# define SWIG_init PyInit__mymodule
在那里(注意 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)
(注意单下划线)。
手动删除
mymodule_wrap.c
中的下划线并在工作模块中重新编译结果。在这个问题中: SWIG and Python3 Import Error python 解释器提示没有找到
PyInit__module
。怎么了?
最佳答案
确保扩展模块被命名为 _mymodule.pyd
而不是 mymodule.pyd
。
解释:
给定一个包含声明的 SWIG .i
文件:
%module mymodule
SWIG 将生成两个文件:mymodule.py
通过 import 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
。关于swig 和 python3 : surplus underscore,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12369131/