2013-09-26 34 views
1

我得到了一个C库wave.so,具有功能接口定义,我遵循的指导这里总结与Python C库仅

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) 

为什么会发生这种情况?我应该如何解决它?

修复: 所以我有MyModule.py和MyModule.so在同一个文件夹,python试图加载MyModule.so而不是MyModule.py,当然他不能成功,更改MyModule的名称。 py to wave.py and

import wave 

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

+1

是您'.so'也叫'MyModule.so'?这将解释Python拾取错误的文件。 – millimoose

+0

哈哈,你是对的,我只是回来试图解决我的愚蠢之前,别人发现它,并在这里你,发现它。 – user40129

回答

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 
+0

按照该指南,我可以在不编写c代码的情况下调用wave.so中的函数。为什么不能在Python中编写一些包装函数,并将其用作我的module.py文件和导入。 – user40129

+1

您可以通过编写一个Cython包装器,如链接中所述,或者您可以使用[ctypes](http://docs.python.org/2/library/ctypes.html?highlight=ctypes#ctypes) 。无论如何,你引用的错误信息表明,在某些时候,Python假设'wave.so'是一个python C扩展,事实并非如此。这是怎么回事,我无法从给出的信息中看出来。尝试缩小问题范围并提供更多信息,这将使其更容易提供帮助。 – dastrobu

+0

谢谢。很好的答案,我设法解决了这个问题。 – user40129