2011-11-06 1 views
37

방금 ​​개념의 증거로 Cython을 사용하는 확장 프로그램으로 C 라이브러리의 일부를 컴파일했습니다. 나는 코드를 해킹 할 수 있었다. (const는 문제를 제쳐두고 수정한다.) 마침내 확장 기능을 구현했다. 내가 새로 만든 확장을 가져올 시도 할 때Cython 컴파일 된 C 확장자 : ImportError : 동적 모듈이 init 함수를 정의하지 않습니다.

그러나, 나는 다음과 같은 오류 있어요 :

ImportError: dynamic module does not define init function 

내가 잘못하고있는 중이 야 무엇을 나는이 문제를 어떻게 해결합니까?

내가 우분투에 Cythn 0.11.2 파이썬 2.6.5를 사용하고는 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 기본 이름 확장자 이름, 예를 들어 일치하지 않음을, 것으로 나타났습니다 이 문제를 피하려면 확장명이 정확히 같아야합니다 (이 경우 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의 버그/기능인 것으로 보입니다. 나는 똑같은 것을 가지고 있었지만 간단히 덧붙였다.

STUFF = "Hi" 

내 .pyx 파일 상단에 문제가 없어졌습니다. 전역 초기화 (cinit 또는 전역 변수 설정)가 없으면 필요한 초기화 코드가 생성되지 않고 나타납니다.

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

:

+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 폴더를 제거한 후에도 지속되었습니다. 필자는 .py 파일에서 생성 된 .cpp 파일이 예제의 클래스 이름을 여전히 참조하고 있음을 발견했습니다. 내 setup.py 가져 오기 작업을 reran, 나는 현재 오라일리 책 사이 썬를 배우고

000000000000c0a0 (__TEXT,__text) external _initmyproj

0

실제로 .so는 파일을 포함하고 같은 문제에 직면하면. 나를 위해 문제를 해결 한 것은 함수에 문서 문자열을 추가하는 것이 었습니다.

이 작동하지 않았다 :

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 
관련 문제