web-dev-qa-db-ja.com

Cython:ImportError:「myModule」という名前のモジュールがありません:cimportを含むcythonモジュールを別のcython小結節に呼び出す方法は?

Cythonモジュールdata.pyxを別のcythonモジュールuser.pyxにインポートしようとしています。すべて正常にコンパイルされますが、pythonモジュールでuser.pyxを呼び出そうとすると、「ImportError:No modulenameddata」というエラーが発生します。

すべてが同じディレクトリにあります。

package/
    __init__.py   #empty
    setup.py      
    data.pxd
    data.pyx
    user.pyx

私のsetup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext


ext_modules = [
    Extension("data", ["data.pyx"]),
    Extension("user", ["user.pyx"],include_dirs = ['myPackageDir'])
    ]

setup(
  name = 'app',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules  
)

次のtest.pyを実行すると、エラーが発生します。

import user     #this line raised the 'ImportError: No module named data' below
user.doSomething()

私が得る例外は

Traceback:
 File "test.py", line 1, in <module>
    import package.user
  File "user.pyx", line 1, in init user (user.c:3384)
ImportError: No module named data

どうすればインポートを機能させることができますか?助けてくれてありがとう。

18
user1030312

Cythonについて何かが足りないかもしれませんが、次のように思います。

import package.user
user.doSomething()
1
rob

別のプロジェクトでこの問題が再び発生します。それを解決するために、これが私がしたことです:

  • すべてのimportおよびcimportステートメントは完全に修飾されている必要があります
  • すべてのpythonコードはrootFolderに含まれている必要があります
  • setup.pyrootFolderと同じレベルである必要があります
  • rooFolderを含むrootFolder内のすべてのフォルダには、__init__.pyが含まれている必要があります
  • setup.pyに拡張機能のinclude_dirsには'.'が含まれている必要があります

これを説明する簡単なプロジェクトを作成しました ここ
これ ページ 私がそれを作成するのを助けました。
しかし、私のプロジェクトはもっと単純で、もしあれば大いに役立ったと思います。
私のプロジェクトは、プロジェクト内のすべてのcythonファイルを自動的にビルドする方法も示しています。

15
user1030312