【问题标题】:c program SWIG to python gives 'ImportError: dynamic module does not define init function'c程序SWIG到python给出'ImportError:动态模块没有定义init函数'
【发布时间】:2018-10-06 01:36:11
【问题描述】:

我正在尝试在带有 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)

如何解决这个问题?

【问题讨论】:

  • gcc -shared example.o example_wrap.o -o _example.so.
  • @CrisFati 您的解决方案部分工作:当我在 python 解释器中执行“导入示例”时,它不会提供回溯,但稍后执行例如 fract(4) 会显示:'NameError: name 'fact ' 没有定义。'无论如何,当我以这种方式启动 python 时:'python -i example.py' 我不必导入任何东西,事实(4)给出了 24 的正确答案。现在有什么问题?
  • example.fact(4)DOT not SPACE)。名字是fact(你的评论还提到了fract)。
  • 太棒了!你可以让它成为一个答案。也有第二条评论。这对这个主题很重要。

标签: python c debian swig


【解决方案1】:

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

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

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

通过命名动态模块 example.so,当 Python 试图加载它时,它会搜索 initexample,而这(显然)没有t 存在,引发 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()

【讨论】:

    【解决方案2】:

    就像 CristiFati 说的“gcc -shared example.o example_wrap.o -o _example.so”

    命名错误并导致错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2016-12-30
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      相关资源
      最近更新 更多