c程序SWIG到python给出了#IncaultError:动态模块没有定义init函数'

时间:2018-04-25 14:15:19

标签: python c debian swig

我正在尝试在带有SWIG的python脚本中使用.c程序。首先,我安装了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

我在这里使用Python 2.7.13

>>>import example

这给了追溯:

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

如何排除这个问题?

2 个答案:

答案 0 :(得分:5)

动态 Python 模块会发生这种情况(至少在当前 swig 版本中):

  • .i 文件中指定了模块名称(让我们坚持使用示例,如教程中所述):%module example
  • 在构建时,会生成2个文件:
    • _ $ {MODULE_NAME} .so :动态模块或共享对象,其名称前面带有的模块名称下划线,在我们的示例 _example.so 中,其中包含实际的 C 编译代码
    • $ {MODULE_NAME} .py :这是前一个的包装器; example.py - 这是模块&#34;入口点&#34;

Python 动态模块必须实现 init * 功能,如[Python 2]: The Module’s Method Table and Initialization Function所述,以及更多内容: init 部分,必须匹配模块( .so )名称(在我们的例子中, init_example )。

通过命名动态模块 example.so ,当 Python 尝试加载它时,它搜索了 initexample ,其中(显然)没有&# 39; t存在,引发 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()

答案 1 :(得分:0)

像CristiFati所说&#34; gcc -shared example.o example_wrap.o -o _example.so&#34;

命名错误并导致错误。