Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cython:如何将C函数分配给Python/Cython变量?_Python_C_Callback_Cython - Fatal编程技术网

Cython:如何将C函数分配给Python/Cython变量?

Cython:如何将C函数分配给Python/Cython变量?,python,c,callback,cython,Python,C,Callback,Cython,目前我正在试用Cython,我想看看是否可以用这种语言编写我的整个项目,不幸的是,我有一个相当大的问题 我有一个C库,我们称它为“lib.C”,我从中导入一个函数: cdef extern from 'lib.c': double compute(double params[7], double IN[2]) 现在,我想将此函数分配给一个不必从Python访问的任意变量: K = compute 这在Python中一点问题都没有,但是在编译时我得到了错误 无法将“double(dou

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

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

cdef extern from 'lib.c':
    double compute(double params[7], double IN[2])
现在,我想将此函数分配给一个不必从Python访问的任意变量:

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

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

用Cython函数包装C函数也不起作用。如果我愿意的话

cdef double _K_wrap(double params[7], double IN[2]):
    return compute(params, IN)

K = _K_wrap
我也犯了同样的错误

任何关于如何将C函数分配给Python/Cython变量的建议都将不胜感激。提前谢谢

编辑

好的,我刚试过hivert的建议:

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)

这会导致相同的错误。可能是我在uu call uu方法中做错了什么。

您必须将函数包装在
cdef类中

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)
然后


您想从Python访问函数吗?我澄清了关于K的一些事情。它只是一个任意变量,我想根据一些输入为其分配不同的函数。函数不一定要从Python中访问。您能写出_调用_函数吗?-我仍然会遇到转换错误。这取决于如何从Python获取参数。你能展示一下你的一些尝试吗?也许是另一个问题。对不起,我太快了。这是一个在我的电脑上编译的正确代码。请注意,我实际上并没有测试它。太好了!这终于奏效了,非常感谢你的帮助。我正要决定在我的项目中不使用Cython。但你的回答实际上教会了我很多关于Cython的事。也许我现在能抓住它。对不起,我不能投票赞成你的答案。我的代表还是太低了,不客气!我刚才投票支持了你的问题,这应该给你一些代表性;-)
>>> import wrap
>>> wrap.example([1.1]+range(6), [4.4, 1.])
8.64