c程序SWIG到python给出';ImportError:动态模块未定义初始化函数';

c程序SWIG到python给出';ImportError:动态模块未定义初始化函数';,python,c,debian,swig,Python,C,Debian,Swig,我正在尝试使用带有SWIG的python脚本中的.c程序。首先,我安装了SWIG并尝试了教程中的简单示例 我在Raspbian GNU/Linux 9.4(stretch)中使用Raspberry Pi 我就是这么做的: 1. swig-python example.i-很好,这创建了两个新文件:“example.py”和“example\u wrap.c” 2. gcc-fpic-I/usr/include/python2.7-c example\u wrap.c-这将创建“example\u

我正在尝试使用带有SWIG的python脚本中的.c程序。首先,我安装了SWIG并尝试了教程中的简单示例

我在Raspbian GNU/Linux 9.4(stretch)中使用Raspberry Pi

我就是这么做的:
1.
swig-python example.i
-很好,这创建了两个新文件:“example.py”和“example\u wrap.c”
2.
gcc-fpic-I/usr/include/python2.7-c example\u wrap.c
-这将创建“example\u wrap.o”文件
3.在Geany中编译example.c;这将给出“example.o”文件

4.
gcc-sharedexample.o example\u 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)
文件“”,第1行,在
ImportError:动态模块未定义初始化函数(初始化示例)
如何解决这个问题?

就像CristiFati说的“gcc-shared example.o example\u wrap.o-o\u example.so”


命名错误并导致错误

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

  • 模块名称(让我们继续使用示例,就像在教程中一样)在.i文件中指定:
    %module example
  • 在生成时,将生成2个文件:
    • \${MODULE_NAME}.so:一个动态模块或共享对象,其名称前面有一个下划线,在我们的示例_example.so中,它包含实际的C编译代码
    • ${MODULE_NAME}.py:它是上一个的包装器;example.py-这是模块“入口点”
Python动态模块必须实现一个init*函数,如上所述,以及更多:init部分后面的必须与模块(.so)名称匹配(在我们的示例中是init_示例

通过将动态模块命名为example.so,当Python试图加载它时,它会搜索(显然)不存在的initexample,从而引发了严重的恐惧


将模块名称更改为\u example.so
gcc-shared example.o example\u wrap.o-o\u example.so
),正如URL所指示的,不再引发异常

然后,功能如下所示:

导入示例#此导入example.py,它会自动导入_example.so >>>example.fact(4),example.my_mod(7,2),example.get_time()
gcc-shared example.o example\u wrap.o-o\u example.so
@CrisFati您的解决方案部分工作:当我在python解释器中执行“导入示例”时,它不会提供回溯,但稍后执行例如fract(4)时,它会说:“NameError:name'fact'未定义。”,当我以这种方式启动python时:“python-I example.py”我不需要导入任何东西,事实(4)给出了24的正确答案。现在的问题是什么?
示例。事实(4)
(点不是空格)。名字是
fact
(你的评论也提到了
fract
)。太棒了!你可以回答。还有第二条评论。这是这个主题的重要一点。