gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:27:59 25 4
gpt4 key购买 nike

我有一个 Cython 扩展类型,我们称之为 Foo,我希望能够将它的一个“实例”(它不是像一个结构体吗?)传递给一个纯 C 函数,这样我就可以从 C 调用扩展类型的方法。我已经尝试从各种 SO 和邮件列表帖子中拼凑出如何做到这一点,但一直无法让它工作。我的 C 技能相当生疏......

我知道以下内容由于多种原因是错误的,但希望它至少说明了我想做的事情......感谢您的耐心!

测试.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()

最佳答案

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

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

关于python - 将 Cython 扩展类型方法传递给纯 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26766791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com