2011-11-06 14 views
37

Właśnie skompilowałem część mojej biblioteki C jako rozszerzenie za pomocą Cythona, jako "dowód koncepcji". Udało mi się zhakować kod (na końcu poprawiono problemy itd.), Aby w końcu uzyskać rozszerzenie.Cython compiled Rozszerzenie C: ImportError: moduł dynamiczny nie definiuje funkcji init

Jednak, kiedy próbował importować nowo utworzonego rozszerzenie, mam następujący błąd:

ImportError: dynamic module does not define init function 

Co robię źle i jak to naprawić?

Używam Cythn 0.11.2 i Python 2.6.5 na Ubuntu 10.0.4

+1

Co wiersza poleceń nie używać do generowania .c? Jak to skompilowałeś? – tito

+0

Nie otrzymałem jeszcze odpowiedzi na pytanie [Cython] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) dotyczące błędu kompilacji. Możesz pomóc. – Phillip

Odpowiedz

56

Odkryłam, że częstą przyczyną tego problemu jest, gdy za pomocą distutils plik instalacyjny do kompilacji kodu, że .pyx nazwa bazowa nie pasuje do nazwy rozszerzenia, np:

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

Aby uniknąć problemu, nazwa rozszerzenia powinna być dokładnie taka sama, w tym przypadku, cython_ext.

+0

Ładne połączenie. Czy ktoś wie, dlaczego to działa, i dlaczego inne imię nie? – dinkelk

+0

Jeszcze nie dostałem odpowiedzi na pytanie [Cython] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) dotyczące błędu kompilacji. Możesz pomóc. – Phillip

+0

@dologan, dziękuję bardzo, aby mnie uratować! – q0987

3

To bardzo późno odpowiedź - ale po prostu miałem ten sam błąd, a mój odszedł, gdy użyłem __cinit__ zamiast __init__. Ciągle dowiaduję się o typach rozszerzeń, więc obecnie nie wiem, dlaczego tak się dzieje. :) (Możesz spojrzeć na http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init). Mam nadzieję, że jest to przydatne dla kogoś.

+0

Nie otrzymałem jeszcze odpowiedzi na pytanie [Cython] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) dotyczące błędu kompilacji. Możesz pomóc. – Phillip

16

Wygląda na to, że jest to błąd/funkcja w Cython. Miałem to samo, ale po prostu dodałem:

STUFF = "Hi" 

na górze mojego pliku .pyx, a problem zniknął. Pojawia się, jeśli nie ma inicjalizacji globalnej (cinit lub ustawienie zmiennej globalnej), że wymagany kod inicjowania nie jest generowany.

+3

Wow. Nie mogę uwierzyć, że to zadziałało, ale naprawił ten sam błąd w mojej bibliotece. – Rick

+0

To również zadziałało dla mnie ... Ku mojemu niedowierzaniu. – coffeepls

0

Podobnie późna odpowiedź ... ale wciąż znajdowałem drogę powrotną do tego pytania w szczególności. Prawdopodobnie jest to związane z problemem niedopasowanych nazw, o którym mówi Dologan.

Co się stało w moim przypadku było to, że adaptowałem przykład, który dostałem do pracy, i dostałem błąd module does not define init function. Zostało to zweryfikowane przy użyciu (np)

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

W wyjściu Polecenie to za Szukałem „init” i okazało

000000000000c0d0 (__TEXT,__text) external _initexample

miałem usunięte wszystkie wystąpienia „przykład” z mojego setup.py i .pyx pliku , ale utrzymywało się to nawet po usunięciu rozszerzenia z site-packages, usunięciu folderów kompilacji i dystrybucji itp. W końcu odkryłem, że plik .cpp generowany z mojego pliku .pyx wciąż odnosił się do nazwy klasy w przykładzie. Raz reran moje prace setup.py, import, a nawet plik .so obejmuje

000000000000c0a0 (__TEXT,__text) external _initmyproj

0

Jestem obecnie nauki Cython z książki O'Reilly, a wobec tego samego problemu. Rozwiązałem problem, dodając do funkcji docstring.

To nie działa:

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 

To działało:

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 
Powiązane problemy