SWIG 和 Python3 导入错误
Posted
技术标签:
【中文标题】SWIG 和 Python3 导入错误【英文标题】:SWIG and Python3 Import Error 【发布时间】:2011-07-27 14:11:34 【问题描述】:我用 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 你会得到这个错误。或者,这 如果模块的名称与 与 %module 指令一起提供的模块名称。仔细检查 接口以确保模块名称和共享对象文件名 匹配。此错误的另一个可能原因是忘记链接 SWIG 生成的包装器代码以及应用程序的其余部分 创建扩展模块。
老实说,我认为这个可能的原因不适用于我的模块,因为它应该是 2.7 和 3 版本的 python 的错误,而不仅仅是 Python 3。
如果有任何建议,我将不胜感激,但考虑到 SWIG 似乎是一个过时的项目,我可能会继续使用带有上述“hack”的 Python 2.7。
最好的问候,
【问题讨论】:
【参考方案1】:生成的 C 模块是否定义了PyInit__pytellapic
函数?
如果模块 init 方法在 Python 3 中发生更改,则名称和配置文件。如果您希望完全相同的 C 代码在 Python 2 和 Python 3 下运行,则必须同时包含旧名称和新名称。有关详细信息,请参阅Migrating C Extensions 章节。
根据SWIG's documentation SWIG 2.0 应该这样做,如果你传递 -py3 参数,但我还没有尝试过。
【讨论】:
-py3参数关心什么,我必须说我试过了,没有成功。我还尝试了swig -python -help
中列出的其他标志,但没有运气。几分钟后(也许是几个小时),我就开始阅读 C 扩展阅读了。感谢您的指导和回复。
我添加了另一条评论,以避免混淆和弄乱这个评论。回答你的问题,我做了一个 grep,结果是:# define SWIG_init PyInit__pytellapic
老实说,我不知道为什么会出现这个错误。
@Sebastian:发布 SWIG 生成的代码可能会有所帮助,但我怀疑您需要在 SWIG 邮件列表中提问。从文档来看,您似乎正在做正确的事情。
C 生成的模块包装文件有 11218 行。我不介意从我不起眼的项目中发布任何内容,就像 GPL 一样,并且可以在 google 代码中找到,但是如果没有人介意的话,我建议使用一些 pastebin 网站。
@Sebastian:如果你想让 cmake 构建扩展,那么你需要让你的 cmake 为你支持的所有 Python 版本编译扩展。这对于 Windows 来说确实是一个好主意。对于其他平台,您需要制作可以在该平台上编译的源代码版本。这应该用 distutils 来完成,真的。在 Windows 上制作所有版本的最简单方法可能是让 cmake 为您希望在 Windows 上支持的每个 Python 版本运行 setup.py sdist
。以上是关于SWIG 和 Python3 导入错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 SWIG 为 python2 和 python3 创建一个模块