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?
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 –
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 –
@ HomunculusReticulli. Güncellenmiş cevabımı görün. Temel olarak, C tipleriniz için sarmalayıcılar oluşturmanız gerekir. – ekhumoro