将Cython扩展类型方法传递给纯C函数

时间:2014-11-05 20:47:32

标签: python c pass-by-reference cython

我有一个Cython扩展类型,我们称之为Foo,我希望能够将它的'实例'(不是像结构吗?)传递给纯粹的 - C函数,所以我可以从C调用扩展类型的方法。我已经尝试拼凑如何从各种SO和邮件列表帖子中做到这一点,但无法让它工作。我的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()

1 个答案:

答案 0 :(得分:1)

Python对象的类型为PyObject*,可以通过Python / C API进行操作。你可能会发现PyObject_CallMethod()及其亲属在这里最有用。

您可能会发现在Cython中编写C函数更容易,它可以执行您想要的任务(即cdef函数),然后从C代码中调用它。这样,Cython就可以完成所有恼人的PyObject*摆弄(包括引用计数),你只需得到你想要的结果。