が解決編集#3Cythonのcimportがパッケージを想定見る、
を.pxdモジュールを見つけることができないように構成されています。
Some_Package/
some_package/
__init__.py
core/
__init__.py
definition.pxd
helper/
__init__.py
helper.pxd
helper.pyx
setup.py
definition.pxd
に私が持っている場合は:
import numpy as np
cimport numpy as np
# ...
ctypedef np.int32_t INT_t
そして、 helper.pxd
私は持っています:
cimport some_package.core.definition
from some_package.core.definition cimport INT_t
# ...
helper.pyx
私はcimport
を何もしませんでした。私はとsetup.py
を設定した:
ext_modules=cythonize('./some_package/helper/helper.pyx', include_dirs=['.', './some_package/core'])
今私の問題は、私は.so
に正常にビルドすることができますが、私はimport some_package.helper.helper
にしようとしたとき、私はImportError
が得たpython setup.py build_ext --inplace
である:
ImportError: No module named "some_package.helper.helper"
私はhelper.cpp
に見てきました次のような行が見つかりました:
__pyx_t_1 = __Pyx_ImportModule("some_package.core.definition"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error)
これはインポートパスと関係があるかもしれないと思いますが、何が間違っていたかはわかりません。すべて__init__.py
は空で、すべてのファイルにabsolute_import
をインポートしました。私もinclude_dirs
を変更しましたが、まだ動作していません。
編集#1
documentationによると、include_dirs
は*.pxd
検索パスに追加します。だから私はとしてもhelper.pxd
にcimport
ステートメントを変更しようとしました:
cimport definition
from definition cimport INT_t
この時間は、cython
はコンパイルできません:"definition.pxd" not found
を。ただし、検索パスに含める必要があります。 setup.py
に続いて
extensions = [
Extension("some_package.core.definition", ["some_package/core/definition.pyx"])
Extension("some_package.helper.helper", ["some_package/helper/helper.pyx"])
]
:
編集#2
迅速なワークアウトはその後のように拡張子を設定し、core/
に空definition.pyx
を追加して
ext_modules=cythonize(extensions)
今cimport some_package.core.definition
ですhelper.pxd
で働いています。
しかし、これはエレガントではありません。
cdef INT_t some_int = 1
しかし、.pxd
ファイルで、任意の実行コードがありません。
編集3
私は最終的に私はいくつかの行が好きな見落としていました。この場合、Cython
はパッケージとして扱われますが、これは.pyx
ファイルではありません。
を回避するには二つの方法があるかもしれません:C
ヘッダから
cdef extern
。インライン関数にラップアラウンドします。
私は私のように、いくつかのラインを持っていたことを見落とす
あなたはあなたのパッケージを 'src'と呼びますか?最初は別の名前を使用することをお勧めします。なぜなら、名前の競合を叫ぶだけなのでです。 – MSeifert
@MSeifertありがとう! 'src'は説明のためです(私はそれがかなり共通していることが分かっています)。実際、 'src'は' some_package'と呼ばれ、 'Some_Package'という名前のルートディレクトリに置かれます。 –
はい、 'src'ファイル用のディレクトリです。最後に、そこからコードを取得しますが、実際のパッケージ内の拡張子としてビルドしてください。概念が変更された場合、少し混乱します。 : - ] – MSeifert