2017-08-28 2 views
2

が解決編集#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.pxdcimportステートメントを変更しようとしました:

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ヘッダから

  1. cdef extern

  2. インライン関数にラップアラウンドします。

    私は私のように、いくつかのラインを持っていたことを見落とす
+0

あなたはあなたのパッケージを 'src'と呼びますか?最初は別の名前を使用することをお勧めします。なぜなら、名前の競合を叫ぶだけなのでです。 – MSeifert

+0

@MSeifertありがとう! 'src'は説明のためです(私はそれがかなり共通していることが分かっています)。実際、 'src'は' some_package'と呼ばれ、 'Some_Package'という名前のルートディレクトリに置かれます。 –

+0

はい、 'src'ファイル用のディレクトリです。最後に、そこからコードを取得しますが、実際のパッケージ内の拡張子としてビルドしてください。概念が変更された場合、少し混乱します。 : - ] – MSeifert

答えて

0

cdef INT_t some_int = 1 

しかし、.pxdファイルで、任意の実行コードがあることはできません。この場合、Cythonはパッケージとして扱われますが、これは.pyxファイルではありません。

を回避するには二つの方法があるかもしれません:Cヘッダから

  1. cdef extern

  2. インライン関数にラップアラウンドします。

関連する問題