4

使用 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 和 Python3 导入错误,python 解释器抱怨找不到PyInit__module.

怎么了?

4

1 回答 1

4

确保扩展模块名为_mymodule.pydnot mymodule.pyd

解释:

给定一个包含声明的 SWIG.i文件:

%module mymodule

SWIG 将生成两个文件:

  • 我的模块.py
  • mymodule_wrap.c

mymodule.pyimport mymodule通过和加载导入 Python _mymodule.pyd

mymodule_wrap.c包含一个入口点函数PyInit__mymodule。此源文件必须链接到最终的_mymodule.pyd.

Python 的import <module>语句寻找:

  1. <module>.pyd与入口点PyInit_<module>
  2. <module>.py.

对于 SWIG 生成的扩展,import mymodule将加载mymodule.py,它会_mymodule.pyd正确加载并查找PyInit__mymodule.

如果使用了错误的扩展名,import mymodule将加载mymodule.pyd并错误地查找PyInit_mymodule.

于 2012-09-11T23:39:29.213 回答