目前我正在试用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变量的建议都会受到极大的欢迎。提前感谢!
编辑
好吧,我刚尝试了海弗特的建议:
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__方法中做错了什么。
发布于 2013-07-23 10:27:32
您必须将函数包装在cdef class中。
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)然后
>>> import wrap
>>> wrap.example([1.1]+range(6), [4.4, 1.])
8.64https://stackoverflow.com/questions/17807359
复制相似问题