1

我获得了 ac 库 wave.so,定义了一个函数接口,我按照这里的指南进行操作

https://stackoverflow.com/a/5868051/2789784

它有效。但是,当我将脚本制作为文件 MyModule.py 并尝试通过

import MyModule

然后它给了我这个错误。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initwave)

为什么会这样?我应该如何解决它?

FIXED:所以我在同一个文件夹中同时拥有 MyModule.py 和 MyModule.so,python 尝试加载 MyModule.so 而不是 MyModule.py,当然他不能成功,将 MyModule.py 的名称更改为 wave.py和

import wave 

解决问题。所以基本上如果你只是想调用一些 c++ 库函数,你真的只需要一个 python 脚本包装器,就是这样,没有 c 编程。我也可以将我的 c++ 共享库用于其他应用程序。

4

1 回答 1

1

当你用 C 编写扩展模块时,必须有一个模块 init 函数。如果你的模块被调用wave,那么扩展模块中必须有一个函数被调用initwave。一个简单的例子是:

static PyMethodDef methods[] = {
    /* methods go here, if any */
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC initwave(void){
Py_InitModule3("wave", methods, "this is the doc string");
}

然后用类似的东西编译扩展:

Extension('wave',
    ['source_file.c', 'another_source_file.c'],
)

您可以导入的扩展模块称为wave.so,(我不知道重命名它是否安全,但绝对不是好主意)在您的 python 脚本MyModule.py中只需执行以下操作:

import wave 
于 2013-09-26T12:41:59.767 回答