c程序SWIG对python给出“导入错误:动态模块未定义init函数“

7lrncoxx  于 2023-02-03  发布在  Python
关注(0)|答案(2)|浏览(136)

我正在尝试使用. c程序在python脚本与swig。首先,我安装了swig,并尝试简单的例子,从教程swig webpage
我正在Raspbian GNU/Linux 9.4(扩展)中使用树莓派
我是这么做的:

  1. swig -python example.i-很好,这创建了两个新文件:"示例. py"和"示例_ Package . c"
  2. gcc -fpic -I/usr/include/python2.7 -c example_wrap.c-这将创建"example_wrap. o"文件
    3.在Geany中编译example. c;这给出了'example. o'文件
  3. 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)

如何解决这个问题?

kx5bkwkv

kx5bkwkv1#

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

  • 模块名(我们使用 example,就像教程中一样)在 .i 文件中指定:%module example
  • 在构建时,将生成2个文件:
    ****_**${模块名称}。因此 *:一个动态模块或共享对象,其名称为模块名称前面加 * 下划线 *,在我们的示例中为 _example.so,其中包含实际的 C 编译代码
  • ${模块名称}.py:它是前一个的 Package 器;example.py -这是模块的“入口点”
  • Python* 动态模块必须实现一个init**函数,如[Python 2.Docs]中所述:模块的方法表和初始化函数等: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()

可能还需要检查:

xytpbqjk

xytpbqjk2#

就像克里斯蒂·法蒂说的 “gcc -共享示例.o示例_ Package .o -o_示例. so”
命名错误并导致错误。

相关问题