2011-11-07 16 views
6

Python (2.6.5) için bir uzantı oluşturmak üzere Cython (0.15.2) kullanıyorum. Bir pxd dosyası ve bir pyx dosyası oluşturdum. Ben özgür (yani üye olmayan) işlevi tanımı deyiminde açýklama iseSerbest işlev için Cython derleme hatası (Python nesne argümanını 'FooBar *' türüne dönüştüremiyor)

cimport capifuncs 

cdef class myArray: 
    cdef capifuncs.myArray *_my_array 
    def __cinit__(self, size): 
     self._my_array = capifuncs.array_new(size) 
     if (self._my_array is NULL): 
      raise MemoryError() 

    def __dealloc__(self): 
     if self._my_array is not NULL: 
      capifuncs.array_free(self._my_array) 

    def __bool__(self): 
     return not capifuncs.IsEmpty(self._my_array) 


    ############################## 
    #  Array methods  # 
    ############################## 

    cpdef getItem(self, unsigned int pos): 
     if capifuncs.IsEmpty(self._my_array): 
      raise IndexError("Array is empty") 
     #if(): 
     # raise IndexError("Array bounds exceeded") 

     return capifuncs.array_get_item(self._my_array, pos) 


    cpdef setItem(self, unsigned int pos, double val): 
     if capifuncs.IsEmpty(self._my_array): 
      raise IndexError("Array is empty") 
     #if(): 
     # raise IndexError("Array bounds exceeded") 

     capifuncs.array_set_item(self._my_array, pos, val) 




# Free functions 
cpdef long someCAPIFuncCall(capifuncs.FooBar *fb, capifuncs.myArray *arr, long start, long stop): 
    return capifuncs.doSomethingInteresting(fb, arr, start, stop) 

, kodu doğru derler ve uzatma üretilir: İşte benim pyx dosyasının içeriği vardır. Bunu yorumsuz ve dosyayı derlemeye çalıştığınızda Ancak, aşağıdaki hata iletisini alabilirsiniz:

cafuncs.pyx:64:23: Cannot convert Python object argument to type 'FooBar *'

Bunun nedeni nedir ve bunu nasıl düzeltebilirim?

cevap

4

cpdef olarak tarif edilen bir fonksiyonu Python ve C

argümanlar Cı veri türleri olarak ilan ise, Cython otomatik olarak Python'dan denir zaman işlevi geçirilen nesnelerin dönüştürmek için çalışacaktır hem çağrılabilir. Ancak bu tür dönüşümler yalnızca sayısal ve dize türleri için mümkündür - diğer tüm türler derleme zamanı hatasıyla sonuçlanır.

Bu işlevi Python'a göstermek mi istediniz? Değilse, cdef ile tanımlayın.

Aksi takdirde, Python'dan ve Python'dan geçmek istediğiniz C türleri için sarıcılar oluşturmanız gerekir. Bunun nasıl yapılacağına dair bazı örnekler için Cython Tutorials'a bakın.

+0

evet, Python'dan C işlevini çağırmak istiyorum - uzantıyı oluşturmanın nedeni, C kitaplığındaki veri türlerini ve işlevlerini Python'dan kullanabilmektir - bu yüzden, C işlevini Python'dan çağırabilir ve C veri türlerini (Python'dan) iletebilir –

+0

Eşit olarak, cp yerine cpdef kullanırsam, kod derler, ancak şu uyarı iletisini alırım: Uyarı: '__pyx_f_6clib_doSomethingInteresting' kullanılmamış. Tutarsız bir şekilde, işlevi python'dan kullanmaya çalıştığımda, AttributeError hatası alıyorum: 'module' nesnesi 'doSomethingInteresting' özniteliği yok –

+0

@ HomunculusReticulli. Güncellenmiş cevabımı görün. Temel olarak, C tipleriniz için sarmalayıcılar oluşturmanız gerekir. – ekhumoro

İlgili konular