swig 和 python3:多余的下划线

thi*_*ias 5 python swig

使用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.

怎么了?

Mar*_*nen 5

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

解释:

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

%module mymodule
Run Code Online (Sandbox Code Playgroud)

SWIG 将生成两个文件:

  • mymodule.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.