仅使用python包装c库

时间:2013-09-26 12:00:55

标签: python python-c-api

我提供了一个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 ++共享库用于其他应用程序。

1 个答案:

答案 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