我提供了一个c库wave.so,定义了一个函数interfaced,我按照这里的指南
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和< / p>
import wave
解决了这个问题。所以基本上如果你只想调用一些c ++库函数,你真的只需要一个python脚本包装器就是这样,没有c编程。我也可以将我的c ++共享库用于其他应用程序。
答案 0 :(得分:1)
在C中编写扩展模块时,必须有模块初始化函数。如果您的模块被称为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