gpt4 book ai didi

python - c 程序 SWIG 到 python 给出 'ImportError: dynamic module does not define init function'

转载 作者:太空狗 更新时间:2023-10-29 16:10:15 26 4
gpt4 key购买 nike

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

我将 Raspberry Pi 与 Raspbian GNU/Linux 9.4 (stretch) 结合使用

我是这样做的:
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)

如何解决这个问题?

最佳答案

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

  • 模块名称(让我们坚持使用 example,就像在教程中一样)在 .i 文件中指定:%module example
  • 在构建时,会生成 2 个文件:
    • _${MODULE_NAME}.so:一个动态模块或共享对象,其名称前面有一个 下划线,在我们的示例中 _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

将模块名称更改为 _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()

关于python - c 程序 SWIG 到 python 给出 'ImportError: dynamic module does not define init function',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50024581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com