使用 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
  • mymodule_wrap.c
  • mymodule.py 通过 import mymodule 导入 Python 并加载 _mymodule.pydmymodule_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/

    10-12 21:34