2011-03-05 43 views
10

我在編譯不同包中的cdef-ed類型時遇到了問題,我無法在cython文檔中找到解釋。在不同的包中編譯依賴的pyx文件

我有此setup.py在我蟒SRC樹的根:

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

setup(
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = [ 
     Extension("flink.pytk.defs.FragIdx", 
     sources = ["flink/pytk/defs/FragIdx.pyx"]), 
     Extension("flink.pytk.fragments.STK_idx", 
     sources = ["flink/pytk/fragments/STK_idx.pyx"]) 
     ] 
) 

FragIdx是CDEF-ED型,在定義弗林克/ pytk/DEFS/FragIdx.pyx:

cdef class FragIdx: 
    cdef public FragIdx parent 
    cdef public FragIdx root 
    cdef public tuple label 
    ... 

而且STK_idx是FragIdx的延伸,在弗林克定義/ pytk /片段/ STK_idx.pyx:

from flink.pytk.defs.FragIdx import FragIdx 
cdef class STK_idx(FragIdx): 
    ... 

當我試圖編譯USI納克在文章開頭列出的setup.py,FragIdx編譯沒事,但是當涉及到STK_idx我收到以下錯誤信息:

flink/pytk/fragments/STK_idx.pyx:5:5: 'FragIdx' is not a type name 

請注意,我的源代碼樹的根目錄列在$ PYTHONPATH中。

我真的很感激,如果任何人都可以擺脫這一點,非常感謝!

丹尼爾

回答

8

哦,那麼,對於那些有類似的問題,看起來也許我找到了答案。

我期待python自動掃描編譯到共享庫FragIdx.so中的符號,而不是像這樣的信息必須顯式提供爲.pxd文件(在Cython運行後它變成C頭文件)。

基本上有過程中涉及的兩個步驟:

  1. 定義(.pxd)文件爲超類的創作;
  2. 通過子類模塊中的cimport(而不是import)導入超類定義。

所以,使它更通用。

假設您已經在模塊pkg1.mod1中定義了您的cdef-ed類型A。那麼你可以在pkg2.mod2中輸入B這個類型,它的子類是A

你的目錄結構會是這個樣子:

pkg1/ 
    mod1.pyx 
    mod1.pxd 
pkg2/ 
    mod2.pyx 
    mod2.pxd 

pkg1/mod1.pxd你會,說:

cdef class A: 
    cdef int a 
    cdef int b 

而且在pkg1/mod1.pyx你會提供您的類的方法。 在pkg2/mod2.pxd,你會:

from pkg1.mod1 cimport A #note "cimport"!! 
cdef class B(A): 
    cdef ... # your attributes here 

再次,在pkg2/mod2.pyx你必須cimport再次符號:

from pkg1.mod1 cimport A #note "cimport"!! 
cdef class B(A): 
    ... # your methods here 

有趣的是,如果你只是想在你的Python使用A代碼,而不是使用它來定義子類型,不需要定義文件mod1.pxd。這與創建擴展類型時需要C編譯器可用的定義相關,而運行Python代碼時沒有這個問題,但由於它不是非常直觀,所以指出它可能很重要出。

該信息實際上在Cython docs中可用,但也許它可能會更加明確。

希望這些信息可以爲別人節省一些。

相關問題