2014-11-05 43 views
0

我有一個Cython擴展類型,我們稱之爲Foo,我希望能夠傳遞它的一個「實例」(是不是它像一個結構?)到一個純C的功能,所以我可以從C調用擴展類型的方法。我試着拼湊在一起如何從各種SO和郵件列表文章做到這一點,但一直沒有得到它工作。我的C技能相當生鏽...將Cython擴展類型方法傳遞給純C函數

我知道以下錯誤的原因很多,但希望它至少說明了我想要做的事......感謝您的耐心等待!

test.c的

#include <stdlib.h> 
#include <stdio.h> 

void cfunc(void* foo, double derp) { 
    double r = foo.bar(derp); 
    printf("%f", r); 
} 

cy_test.pyx

import cython 
cimport cython 

cdef extern from "/tmp/test.c": 
    void cfunc(void*, double) 

cdef public class Foo[type FooType, object Foo]: 
    cdef double spam 

    def __init__(self, spam): 
     self.spam = spam 

    cdef public double bar(self, double q) nogil: 
     q *= 15. + self.spam 
     return q 

cpdef call_func(): 
    foo = Foo(1.5) 
    cfunc(&foo, 10.) 

call_func() 
+0

確實有助於給出反映一些實際用例的名稱,而不是像'Foo'和'spam'這樣的通用名稱;例如,你可能會明白爲什麼,例如,你傳遞一個'Foo'對象來讓它的bar被叫做(可能是非Python中心的,非OO)的C代碼,而不是傳遞一個綁定方法作爲可調用的在第一個地方。 – abarnert 2014-11-05 21:11:58

回答

1

Python對象PyObject*類型,它可以通過的Python/C API來操縱的。您可能會發現PyObject_CallMethod()及其親戚在這裏最有用。

您可能會發現在Cython中編寫C函數可以更輕鬆地完成您想要的任務(即cdef函數),然後從C代碼中調用該函數。這樣,Cython可以完成所有令人討厭的PyObject*擺弄(包括引用計數),並且您只需得到您想要的結果。