swig 编译出现的 ImportError: dynamic module does not define init function 错误

最近又尝试使用 swig 编译C++代码给 python 调用。结果测试其中一个示例https://github.com/swig/swig/tree/master/Examples/python/std_vector的时候出现

ImportError: dynamic module does not define init function 

错误。

半天都没发现原因在哪,总是提示导入错误。但是编译的时候一点错误都没有,甚至尝试直接导入编译生成的共享库文件 _example.so 都没问题。搜索原因给的也是乌七八糟,没有解决问题。后来一拍脑门才想起来原因可能是当前目录同时存在 example.py 和 example.so 文件。这个 example.so 是之前忘记怎么编译测试的时候生成的,没有删除。造成的结果就是导入 example 的时候 python 导入的是 example.so ?总之因为这个导致编译生成的 example.py 无法导入。从目录中删除 example.so,上述问题解决。

编译执行的命令如下

swig -python -c++ example.i
g++ -fPIC -shared example_wrap.cxx -o _example.so -I /usr/include/python2.7/
# 不要忘记加下划线!!

swig -python -c++ example.i 会生成 example.py 和 example_wrap.cxx 两个文件。接着把 example_wrap.cxx 和其他需要的文件编译成共享库就可以了。共享库的名字需要是 _example.so ,这个可以从example.py 中看到 swig 给 共享库默认起了个啥名字。调用 共享库一般通过 example.py 进行间接调用,example.py 对共享库进行了封装。

说一个类似的 bug,测试的时候尝试在目录中建立了一个名字叫 abc.py 的文件。结果 ipython 就无法打开进入了。这个原因倒是非常直观。ipython在启动初始化的时候需要导入一个名字是 abc 的 模块,因为导入的优先级是当前目录最高,所以个人建立的 abc.py 触发了这个bug. 这里就得吐槽一下软件包的开发者了,abc 这么 general 的名字怎么能作为正式发行的软件包里的文件名的,这种不应该起一些一看就不明觉厉的高大上名字么。

Visits: 221

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

*