我正在尝试在带有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)
如何排除这个问题?
答案 0 :(得分:5)
动态 Python 模块会发生这种情况(至少在当前 swig 版本中):
%module example
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;
命名错误并导致错误。