web-dev-qa-db-ja.com

Cythonコンパイル済みC拡張:ImportError:動的モジュールはinit関数を定義していません

Cythonを使用した拡張機能として、「概念実証」としてCライブラリの一部をコンパイルしました。私はなんとかコードをハックして(const correctnesの問題などは別として)、ついに拡張機能をビルドしました。

しかし、新しく作成した拡張機能をインポートしようとすると、次のエラーが発生しました。

ImportError: dynamic module does not define init function 

私は何を間違っているのですか、どうすれば修正できますか?

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

45

この問題のよくある原因は、distutilsセットアップファイルを使用してコードをコンパイルするときに、.pyxベース名が拡張子名と一致しないことです。たとえば、

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

この問題を回避するには、拡張子名を完全に同じにする必要があります。この場合、cython_ext

71
Dologan

Cythonのバグ/機能のようです。私は同じことをしましたが、単に追加しました:

STUFF = "Hi"

私の.pyxファイルの一番上に、問題は消えました。グローバル初期化(a cinitまたはグローバル変数の設定)がない場合、必要な初期化コードが生成されていないように見えます。

28
Tim

これは非常に遅い回答ですが、同じエラーが発生したため、__cinit__ の代わりに __init__。拡張機能のタイプについてはまだ学んでいるので、なぜこれが起こるのか現在はわかりません。 :)( http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init をご覧ください)これが誰かに役立つことを願っています。

3
joon

別のpython環境、python3を使用している端末から生成されたライブラリを使用しようとしているときに、python2を実行している端末で誤ってcythonを呼び出した場合、別の本当に遅い回答です。

どこでも同じpythonバージョンを使用して修正しました。

1
Cola_Colin

これは、doc-stringを関数に追加することで解決されます。

0
GetLastError

同じエラーが発生し、メインの.pyスクリプトを「専用コンソールで実行」モードで実行することで解決しました。ツール-設定-実行で利用できます。

0

同様に遅い答え...しかし、私は特にこの質問に戻る道を見つけ続けました。それはおそらく、Dologanが対処している名前の不一致の問題に関連しています。

私の場合に起こったことは、私が機能させた例を採用していて、module does not define init functionエラーが発生したことです。これは(例)を使用して確認されました

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

このコマンドの出力で、「init」を検索して見つけました

000000000000c0d0(__TEXT、__ text)外部_initexample

私はsetup.pyと.pyxファイルから 'example'のすべてのインスタンスを削除しましたが、これはsite-packagesから拡張機能を削除し、buildフォルダーとdistフォルダーを削除した後でも持続しました。 .pyxファイルから生成された.cppファイルは、例のクラス名をまだ参照していました。 setup.pyを再実行すると、インポートが機能し、実際に.soファイルに

000000000000c0a0(__TEXT、__ text)外部_initmyproj

0
Gertlex

私はそれを解決します

def cinit(self): pass

それが役に立てば幸い。

0
文佳鹏