2017-07-27 4 views
0

私はcythonのいくつかの奇妙な振る舞いを見つけただけで、誰かが私を啓発できることを願っています。cythonクラスをサブクラス化する: 'cimport'ingのときにpxdファイルが見つかりません

私は2つのパッケージAとBを持っていますが、どちらもdistutilsを使ってビルドされています。これはいくつかのcythonクラス(その多くはC++クラスをラップしています)です。

パッケージAでは、私はBaseAClassを.pxdファイルで宣言し、対応する.pyxで完全に宣言したcythonクラスを持っています。私は単に

# in package B tree, .pyx file 
cimport A.stuff._A as _A 
cdef BClass(object): 
    cdef _A.BaseAClass my_aclass 
    def __cinit__(self, aclass): 
     self.my_aclass = aclass 

を行うことによって BaseAClassメンバーを取るクラスを構築することができましたパッケージBIに

今すぐパッケージAにBaseAClassをサブクラス化する他の多くのクラスを持っていると私はコンパイルと使用して問題がありませんこれらのクラス。

は、しかし、私は、パッケージBにBaseAClassをサブクラス化しようとした場合:

# in package B tree, .pyx file 
cimport A.stuff._A as _A 
cdef BClass(_A.BaseAClass): 
    """put a constructor here""" 

と私はエラー'_A.pxd' not foundを取得cythonizeしてみてください。但し、私がすれば

# in package B tree, .pyx file 
cdef BClass(A.stuff._A.BaseAClass): 
    """put a constructor and methods here""" 

問題ありません!うまくいけば、誰かが何が起こっているのかを知っているでしょう!

私がコンパイルするとき、パッケージAのpxdファイルがパッケージBで利用可能であることを確認するために、追加フラグ "-I/path/to/packageA/stuff"を渡すことに注意してください。同様のcythonize .pyはscipyのために使用され、私はすでに__init__.pyのファイルをどこにも持っていて、私は__init__.pxdというファイルを追加しようとしましたが、助けにはなりませんでした。

答えて

1

インポートは、from stuff cimport _Aと記述する必要があります。stuff.pxdは、インポートを行うファイル.pyxと同じディレクトリにある定義ファイルです。

cimport A.stuff._A as _Aは、おそらく予期しない動作であるという定義ファイルを探します。

Cythonは最初にcimport X.sub_package as Yの形式でインポートを受け入れるべきではないでしょう。

+0

あなたは 'numpy as np'をどう思いますか?たとえば、[here](https://cython.readthedocs.io/en/latest/src/tutorial/numpy.html#adding-types)を参照してください。 – stefano

+0

私は '' CYMORT XX.something.something_else as YY'という形式は意味しません受け付けます。通常の 'cimport X as Y'は動作しますが、サブパッケージは動作しません。どちらか、またはそのケースを正しく処理します。 Cythonのレポの問題としてそれを上げる価値があるかもしれません。 – danny

関連する問題