我用 C 编写了一个库。我使用SWIG http://swig.org为 Java、Python 等生成绑定。我设法为这两种语言编写自定义类型映射等等。我还设法使用我的库(自定义协议)并与我用 C 编写的服务器、我用 Java 编写的客户端以及我用 Python 编写的客户端进行通信。
最近,我遇到了一个多重继承的问题solution http://code.activestate.com/recipes/204197-solving-the-metaclass-conflict/我发现很聪明。但是,当尝试使用 Python 3 复制错误时,错误消失了(maybe在版本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 和提到的“hack”。
此致,
生成的C模块是否有PyInit__pytellapic
函数定义?
名称和配置文件(如果模块 init 方法在 Python 3 中已更改)。如果您希望完全相同的 C 代码在 Python 2 和 Python 3 下运行,则必须同时包含旧名称和新名称。请参阅迁移 C 扩展 http://python3porting.com/cextensions.html#module-initialization章节了解更多信息。
根据SWIG 的文档 http://swig.org/Doc2.0/SWIGDocumentation.html#Python_python3support如果传递 -py3 参数,SWIG 2.0 应该会这样做,但我还没有尝试过。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)