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

sma*_*jli 3 c python debian swig

我试图在使用SWIG的python脚本中使用.c程序.首先,我安装了SWIG并尝试了教程swig网页中的简单示例.

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我在这里使用Python 2.7.13

>>>import example
Run Code Online (Sandbox Code Playgroud)

这给了追溯:

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

如何排除这个问题?

Cri*_*ati 5

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

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

一个Python的动态模块必须实现的init*功能上解释[Python的2]:模块的方法表和初始化函数,以及更多:随之而来的后初始化部分,必须(符合模块的.so)名(在我们的情况下,它init_example).

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

URL名称更改为_example.so(gcc -shared example.o example_wrap.o -o _example.so),不再引发异常.

然后,这些功能可用如下:

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