2011-11-06 65 views
37

我剛剛編譯了C庫的一部分作爲使用Cython的擴展,作爲「概念驗證」。我設法破解代碼(不考慮const糾正問題等),最終得到一個擴展。Cython編譯的C擴展名:ImportError:動態模塊沒有定義init函數

然而,當我嘗試導入新創建的擴展,我得到了以下錯誤:

ImportError: dynamic module does not define init function 

什麼我做錯了,我該如何解決這個問題?

我使用Cythn 0.11.2和Python 2.6.5在Ubuntu 10.0.4

+1

你使用什麼命令行生成.C?你是如何編譯它的? – tito

+0

我還沒有得到關於編譯錯誤的[Cython問題](http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type)上的響應。你可以幫忙。 – Phillip

回答

56

我發現這個問題的常見原因是,使用Distutils安裝文件來編譯代碼時,該.pyx基地名稱不匹配的擴展名,如:

ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work 

爲了避免這個問題,擴展名應該完全相同,在這種情況下,cython_ext

+0

好的電話。有誰知道這是爲什麼起作用,爲什麼不同的名稱不適用? – dinkelk

+0

我還沒有得到關於編譯錯誤的[Cython問題](http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type)上的響應。你可以幫忙。 – Phillip

+0

@dologan,非常感謝你爲我節省一天! – q0987

3

這是一個非常晚的答案 - 但我只是有同樣的錯誤,而我走了,當我用__cinit__代替__init__。我仍然在關注擴展類型,因此我不知道爲什麼會發生這種情況。 :)(你可以看看http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init)希望這對某人有用。

+0

我還沒有得到關於編譯錯誤的[Cython問題](http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type)上的響應。你可以幫忙。 – Phillip

16

看來這是Cython中的一個bug /功能。我有同樣的事情,但只是增加了:

STUFF = "Hi" 

到我的.pyx文件的頂部,問題就消失了。如果沒有全局初始化(一個cinit或設置一個全局變量),則顯示沒有生成所需的初始化代碼。

+3

哇。我不能相信這真的有用,但它解決了我的圖書館中的相同錯誤。 – Rick

+0

這也適用於我。讓我難以置信。 – coffeepls

0

同樣,一個遲到的答案......但我一直在尋找我特別回到這個問題的方式。這可能與Dologan解決的不匹配名稱問題有關。

我的情況發生了什麼,我正在調整一個我上班的例子,並得到了module does not define init function錯誤。這是通過使用(例如)

nm -m build/lib.macosx-10.9-x86_64-2.7/myproj.so

在此命令的輸出驗證我搜索「初始化」,發現

000000000000c0d0 (__TEXT,__text) external _initexample

我已經從我的setup.py和.pyx文件中刪除「示例」的所有實例,但是即使從site-packages中刪除了擴展名,刪除了build和dist文件夾等等,這仍然存在。我終於發現從我的.pyx文件生成的.cpp文件仍在引用示例中的類名稱。一旦我重新我setup.py,進口的作品,堪與.so文件包括

000000000000c0a0 (__TEXT,__text) external _initmyproj

0

目前,我正在學習用Cython與O'Reilly的書,以及所面臨的同樣的問題。對我來說,解決問題的方法是在函數中添加文檔字符串。

這不起作用:

def fib(int n): 
    cdef int i 
    cdef double a=0.0, b=1.0 
    for i in range(n): 
     a, b = a + b, a 
    return a 

這工作:

def fib(int n): 
    '''Returns the nth Fibonacci number.''' 
    cdef int i 
    cdef double a=0.0, b=1.0 
    for i in range(n): 
     a, b = a + b, a 
    return a 
相關問題