使用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
。
怎么了?
答案 0 :(得分:4)
确保扩展模块的名称为_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
的内容不正确。