2013-09-26 30 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