SWIG和Python3导入错误

5 投票
1 回答
3377 浏览
提问于 2025-04-16 22:21

我写了一个用C语言编写的库。我使用SWIG来为Java、Python等语言生成接口。我成功为这两种语言写了自定义的类型映射,还成功地使用我的库(一个自定义协议)与我用C写的服务器进行通信,同时也能与我用Java和正在用Python写的客户端进行交流。

最近,我遇到了一个多重继承的问题,找到了一种我觉得很聪明的解决方案。但是,当我尝试用Python 3重现这个错误时,发现错误消失了(可能在3版本中已经解决了)。实际上,同样的代码、同样的项目和同样的源代码在调用python3时无法运行,但在调用python2.7时却可以正常工作。

我收到了这样的提示:

ImportError: dynamic module does not define init function (PyInit__pytellapic)

我已经阅读了SWIG文档中关于这个错误的解释,虽然有些不同:

import example
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ImportError: dynamic module does not define init function (init_example)

文档中提到:

这个错误几乎总是因为给共享对象文件起了个不好的名字。例如,如果你创建了一个文件叫example.so,而不是_example.so,你就会遇到这个错误。或者,如果模块的名字和%module指令中提供的模块名不一致,也会出现这个错误。请仔细检查接口,确保模块名和共享对象文件名匹配。另一个可能导致这个错误的原因是,在创建扩展模块时忘记将SWIG生成的包装代码与应用程序的其余部分链接起来。

老实说,我觉得这些可能的原因不适用于我的模块,因为这应该是Python 2.7和3版本都会出现的错误,而不仅仅是Python 3。

我会很感激任何建议,但考虑到SWIG似乎是一个过时的项目,我可能会继续使用Python 2.7和提到的“黑科技”。

祝好,

1 个回答

3

生成的C模块里有没有定义一个叫做PyInit__pytellapic的函数呢?

在Python 3中,模块初始化的方法名称和格式发生了变化。如果你想让同一段C代码在Python 2和Python 3中都能运行,就必须同时包含旧的和新的名称。想了解更多,可以查看迁移C扩展这一章节。

根据SWIG的文档,如果你传递了 -py3 参数,SWIG 2.0应该可以做到这一点,但我还没有尝试过。

撰写回答