2017-07-27 72 views
0

我剛剛偶然發現了一些奇怪的行爲在cython中,我希望有人能夠啓發我。子類化cython類:pxd文件沒有找到'cimport'ing

我有兩個包A和B,都使用distutils構建,因爲我有幾個cython類(其中許多包裝C++類)。

在包A中,我有一個cython類,我把它稱爲BaseAClass,它在.pxd文件中聲明並在相應的.pyx文件中完全聲明。我有一個在包A.繼承BaseAClass現在

在包裝BI已經能夠建立一個採取BaseAClass成員類,只需做

# 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 

許多其他類和我沒有問題彙編和使用這些類。

但是,如果我嘗試在程序包B的子類BaseAClass

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

我嘗試cythonize我得到的錯誤'_A.pxd' not found。但是,如果我做

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

沒問題!希望有人知道發生了什麼!

請注意,當我編譯時,我傳遞額外的標誌「-I/path/to/packageA/stuff」以確保包A中的pxd文件可用於包B.還要注意,我使用類似的cythonize .py用於scipy,我已經有__init__.py文件,我甚至嘗試添加__init__.pxd文件,但它沒有幫助。

回答

1

導入應寫爲from stuff cimport _A其中stuff.pxd是一個定義文件,與導入的.pyx文件位於同一目錄中。

cimport A.stuff._A as _A使Cython尋找一個名爲_A.pxd的定義文件,這可能是意外的行爲。

Cython可能不應該首先以cimport X.sub_package as Y的形式接受導入。

+0

如何將cimport numpy設置爲np?請參閱[在這裏](https://cython.readthedocs.io/en/latest/src/tutorial/numpy.html#adding-types) – stefano

+0

我的意思是「cimport XX.something.something_else」的形式,因爲YY'不應該被接受。常規的'cimport X as Y'可以工作,但不包含子包。要麼或正確處理這種情況。可能值得將它作爲Cython回購問題提出。 – danny