2011-11-06 9 views
37

Cythonを使った拡張として、私のCライブラリの一部を "proof of concept"としてコンパイルしました。私は最終的に拡張機能を構築するために、コード(constなどの問題を除いて)をハックすることができました。私は、新しく作成された拡張子をインポートしようとしたときにCythonでコンパイルされたC拡張:ImportError:ダイナミックモジュールでinit関数が定義されていません

しかし、私は次のエラーしまった:私が間違って何を

ImportError: dynamic module does not define init function 

やっていると私はこれをどのように修正するのですか?

私はUbuntuでCythn 0.11.2とPython 2.6.5を使用していますが10.0.4

+1

を?どのようにコンパイルしましたか? – tito

+0

私はまだコンパイルエラーに関して[Cythonの質問](http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type)の回答を得ていません。お手伝いできるかもしれません。 – Phillip

答えて

56

この問題の頻繁な原因は例えば、.pyxベース名は、拡張子名と一致しないこと、コードをコンパイルするdistutilsのセットアップファイルを使用しているとき、あることを私を見つけた:

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のバグ/機能のようです。私は同じことがあったが、単純に加算:

STUFF = "Hi" 

私.pyxファイルの先頭に、問題が去っていきました。グローバル初期化(cinitまたはグローバル変数の設定)がない場合、必要な初期化コードが生成されない場合に表示されます。

+3

うわー。私は実際に働いたとは思えませんが、私のライブラリーで同じバグが修正されました。 – Rick

+0

これも私のために働いた..私の不信に。 – coffeepls

0

同様に遅い答え...しかし、私はこの質問に戻って自分の道を見つけ続けました。おそらく、Dologanが取り組んでいる不一致の名前の問題に関係しています。

私の場合は、私が仕事をした例を適用していて、module does not define init functionエラーが発生しました。これは私が私のsetup.pyと.pyxファイルから「例」のすべてのインスタンスを削除していた「のinit」の検索と

000000000000c0d0 (__TEXT,__text) external _initexample

を見つけ、このコマンドの出力で

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

(例えば)を使用して検証しましたしかし、これはsite-packagesから拡張子を削除してもビルドフォルダとdistフォルダを削除しても残っていました。私の最終的には.pyファイルから生成された.cppファイルが例のクラス名を参照していました。私は私のsetup.py、輸入作品をreran、と私は現在、オライリーの本でCythonを学んでいる

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 

これは働いていた:あなたが.Cを生成するために使用したのは何のコマンドライン

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 
関連する問題