50

「概念実証」として、Cythonを使用した拡張機能としてCライブラリの一部をコンパイルしました。私はなんとかコードをハックして(constは問題を修正するなど)、最終的に拡張機能を構築しました。

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

ImportError: dynamic module does not define init function 

私は何を間違っているのですか、そしてこれをどのように修正しますか?

Ubuntu10.0.4でCythn0.11.2とPython2.6.5を使用しています

4

9 に答える 9

74

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

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

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

于 2014-01-29T12:08:46.607 に答える
33

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

STUFF = "Hi"

.pyxファイルの先頭に移動すると、問題は解決しました。グローバル初期化(cinitまたはグローバル変数の設定)がない場合、必要な初期化コードが生成されていないように見えます。

于 2012-12-20T16:30:30.820 に答える
2

これは非常に遅い答えです-しかし、私はちょうど同じエラーがあり、私が__cinit__の代わりに使用したときに私のものは消えました__init__。私はまだ拡張機能の種類について学習しているので、現在、なぜこれが発生するのかわかりません。:)(http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-initをご覧ください)これが誰かに役立つことを願っています。

于 2012-12-03T05:25:17.910 に答える
1

私の場合のもう1つの非常に遅い答えは、python3を使用して、別のpython環境にある端末から生成されたライブラリを使用しようとしたときに、python2を実行している端末で誤ってcythonを呼び出していました。

どこでも同じPythonバージョンを使用すると修正されました。

于 2018-04-15T19:18:29.693 に答える
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

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

000000000000c0a0(__TEXT、__ text)外部_initmyproj

于 2014-06-10T21:27:14.613 に答える
0

私もこの問題に遭遇しました。Cythonファイルに次の少なくとも1つが含まれていることを確認してください。

  • 通常のPythondef
  • 通常のPythonクラス(ではないcdef class
  • Python初期化の行。a=Noneまたはロガーロード

そうしないと、CythonはPyInitモジュールをロードするために必要なルーチンを生成しないため、モジュールはPythonによってインポートできません。

于 2020-12-20T18:19:05.423 に答える
-1

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

于 2018-01-21T09:56:33.827 に答える
-1

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

于 2018-11-15T09:39:15.120 に答える
-1

私はそれを解決します

def cinit(self): pass

それが役に立てば幸い。

于 2019-11-19T05:17:52.543 に答える