SWIG和Python3导入错误

时间:2011-07-27 14:11:34

标签: python python-3.x swig

我在C中编写了一个库。我使用SWIG生成Java,Python等的绑定。我设法为两种语言编写自定义类型映射等等。我还设法使用我的库(自定义协议)并与我用C编写的服务器进行通信,使用Java编写的客户端,以及用Python编写的客户端。

最近,我遇到了一个多重继承问题solution我觉得很聪明。但是,当尝试使用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你会得到这个错误。或者,这个   如果模块的名称与...不一致,则可能出现错误   随%模块指令提供的模块名称。仔细检查一下   接口,以确保模块名称和共享对象文件名   比赛。此错误的另一个可能原因是忘记链接   SWIG生成的包装代码与您的应用程序的其余部分   创建扩展模块。

老实说,我认为这个可能的原因不适用于我的模块,因为它应该是2.7和3版python的错误,而不仅仅是Python 3。

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

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:2)

生成的C模块是否定义了PyInit__pytellapic函数?

如果模块初始化方法在Python 3中已更改,则为名称和配置文件。如果要在Python 2和Python 3下运行完全相同的C代码,则必须同时包含旧名称和新名称。有关详细信息,请参阅Migrating C Extensions章节。

根据SWIG's documentation,如果你传递-py3参数,SWIG 2.0应该这样做,但我还没有尝试过。