c program SWIG to python gives 'ImportError: dynamic module does not define init function'

c program SWIG to python gives 'ImportError: dynamic module does not define init function'

我正在尝试将 python 脚本中的 .c 程序与 SWIG 一起使用。首先,我安装了 SWIG 并尝试了教程 swig webpage 中的简单示例。

我正在使用 Raspberry Pi 和 Raspbian GNU/Linux 9.4(拉伸)

我就是这样做的:
1. swig -python example.i - 很好,这创建了两个新文件:'example.py' 和 'example_wrap.c'
2. gcc -fpic -I/usr/include/python2.7 -c example_wrap.c - 这会创建 'example_wrap.o' 文件
3. 在Geany中编译example.c;这给出 'example.o' 文件
4. gcc -shared example.o example_wrap.o -o example.so - 现在创建了一个新文件 'example.so'。
是时候试试了:

python

我这里用的是Python2.7.13

>>>import example

这给出了回溯:

File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initexample)

如何解决这个问题?

正如 CristiFati 所说 "gcc -shared example.o example_wrap.o -o _example.so"

命名错误导致错误。

这是动态 Python 模块的情况(至少在当前 swig 版本中):

  • 模块名称(让我们坚持使用 example,就像在教程中一样)在 .i 文件中指定:%module example
  • 在构建时,生成了 2 个文件:
    • _${MODULE_NAME}.so:一个动态模块或共享对象,名称前面有模块名称通过 下划线,在我们的示例中 _example.so,其中包含实际的 C 编译代码
    • ${MODULE_NAME}.py:这是对前一个的包装; example.py - 这是模块 "entry point"

A Python 动态模块必须实现一个 init* 函数作为在 [Python 2.Docs]: The Module’s Method Table and Initialization Function 上解释,以及更多:init 部分之后的内容, 必须匹配模块 (.so)名称(在我们的例子中是init_example)。

通过命名动态模块example.so,当Python试图加载它时,它搜索initexample(显然)不存在,引发 ImportError.

将模块名称更改为_example.so (gcc -shared example.o example_wrap.o -o _example.so),作为 URL也指示,不再引发异常。

那么,函数是这样的:

>>> import example  # This imports example.py which automatically imports _example.so
>>> example.fact(4), example.my_mod(7, 2), example.get_time()