我在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”。
致以最诚挚的问候,
答案 0 :(得分:2)
生成的C模块是否定义了PyInit__pytellapic
函数?
如果模块初始化方法在Python 3中已更改,则为名称和配置文件。如果要在Python 2和Python 3下运行完全相同的C代码,则必须同时包含旧名称和新名称。有关详细信息,请参阅Migrating C Extensions章节。
根据SWIG's documentation,如果你传递-py3参数,SWIG 2.0应该这样做,但我还没有尝试过。