首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cython:如何将C函数赋值给Python/ Cython变量?

Cython:如何将C函数赋值给Python/ Cython变量?
EN

Stack Overflow用户
提问于 2013-07-23 10:17:18
回答 1查看 914关注 0票数 3

目前我正在试用Cython,并想看看是否可以用这种语言编写我的整个项目,不幸的是,我遇到了相当大的问题。

我有一个C库,让我们把它称为"lib.c“,从中导入一个函数:

代码语言:javascript
复制
cdef extern from 'lib.c':
    double compute(double params[7], double IN[2])

现在,我想将这个函数赋值给一个不需要通过Python访问的任意变量:

代码语言:javascript
复制
K = compute

这在Python中一点问题都没有,但是在编译时我得到了错误。

无法将“double (double *,double*)”转换为Python对象。

用Cython函数包装C函数也不起作用。如果我做了

代码语言:javascript
复制
cdef double _K_wrap(double params[7], double IN[2]):
    return compute(params, IN)

K = _K_wrap

我也会犯同样的错误。

任何关于如何将C函数赋值给Python/ Cython变量的建议都会受到极大的欢迎。提前感谢!

编辑

好吧,我刚尝试了海弗特的建议:

代码语言:javascript
复制
ctypedef double (*Func)(double params[7], double IN[2])

cdef class FunctionHandler:
    cdef Func K
    def __cinit__(self, Func f):
        self.K = f
    def __call__(self, double params[7], double IN[2]):
        return self.K(params, IN)

K = FunctionHandler(compute)

这将导致同样的错误。可能我在__call__方法中做错了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-23 10:27:32

您必须将函数包装在cdef class中。

代码语言:javascript
复制
cdef extern from 'lib.c':
    double compute(double params[7], double IN[2])

ctypedef double (*Func)(double params[7], double IN[2])

cdef class FunctionHandler:
    cdef Func K

    # def __cinit__(self, Func f):
    #    self.K = f

    def __init__(self):
        raise Exception, "FunctionHandler cannot be instanciated from Python"

    def __call__(self, list pm, list inn):
        cdef double parm[7], cin[2]
        for i in range(7):
            parm[i] = pm[i]
        for i in range(2):
            cin[i] = inn[i]
        return self.K(parm, cin)

cdef CreateFunctionHandler(Func f):
    cdef FunctionHandler res = FunctionHandler.__new__(FunctionHandler)
    res.K = f
    return res

example = CreateFunctionHandler(compute)

然后

代码语言:javascript
复制
>>> import wrap
>>> wrap.example([1.1]+range(6), [4.4, 1.])
8.64
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17807359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档