【问题标题】:Passing a Cython extension type method to a pure C function将 Cython 扩展类型方法传递给纯 C 函数
【发布时间】:2014-11-05 20:47:31
【问题描述】:

我有一个 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()

【问题讨论】:

  • 给出反映一些实际用例的名称确实很有帮助,而不是像Foospam这样的通用名称;这可能会说明为什么,例如,您传递一个Foo 对象以使其bar 由(可能是非以Python 为中心的,非OO)C 代码调用,而不是将绑定方法作为可调用对象传递首先。

标签: python c pass-by-reference cython


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    相关资源
    最近更新 更多