2014-11-05 101 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*摆弄(包括引用计数),并且您只需得到您想要的结果。

相关问题