概述
我正在学习如何通过制作包装器从Python调用C函数。我的最终目标是将Python中声明的大型复杂数组传递给C函数,并取回其他巨大的复杂数组。在
为了理解从Python调用C函数的基本原理,我从一个简单的示例开始。我定义了一个函数,它读取一个双精度数组(任意大小),并返回所有值的和。这是我的wrapperTest.c代码:#include
static PyObject *sumArray(PyObject * self, PyObject * args){
PyObject *ret;
PyObject* myTuple;
if(!PyArg_ParseTuple(args, "O", &myTuple)) return NULL;
printf("PyTuple_Size=%ldn", PyTuple_Size(myTuple));
double *my_array;
my_array=(double*)malloc(sizeof(double)*PyTuple_Size(myTuple));
int tupleSize;
tupleSize=PyTuple_Size(myTuple);
int i;
PyObject* tupleItem;
for(i=0; i
tupleItem=PyTuple_GetItem(myTuple, i);
if(!PyFloat_Check(tupleItem)){
printf("Error: tuple contains a non-float value");
exit(1);
}
my_array[i]=PyFloat_AsDouble(tupleItem);
printf("my_array[%d]=%lfn", i, my_array[i]);
}
double result;
result=0.;
for(i=0; i
result+=my_array[i];
}
printf("result=%lfn", result);
ret=PyFloat_FromDouble(result);
free(my_array);
return ret;
}
static PyMethodDef wrapperTest_funcs[] = {
{"sumArray", (PyCFunction)sumArray,
METH_VARARGS, ""},
{NULL}
};
void initwrapperTest(void)
{
Py_InitModule3("wrapperTest", wrapperTest_funcs,
"Extension module example!");
}
我可以通过运行脚本成功地编译扩展设置.py在
^{pr2}$
使用命令“python设置.py安装”。此外,我可以在运行Python时导入扩展并执行函数。但是,我不能总是从我定义的函数中得到正确的结果。例如,如果我尝试传递数组a=(1.2,2.4),则得到的结果是:>>> import wrapperTest
>>> a=(1.2, 2.4)
>>> b=wrapperTest.sumArray(a)
PyTuple_Size=2
my_array[0]=1.200000
my_array[1]=2.400000
result=3.600000
>>> b
3.5999999999999996
显然,正确的结果是3.6(用C编写的函数打印的结果),但是在Python中得到的最终结果是3.599999999999996。当然,它非常接近正确的结果,但不一样。我错过了什么?在
最后
以上就是冷艳背包为你收集整理的python double函数_在从Python调用的C函数中使用PyFloat_FromDouble时获得错误结果的全部内容,希望文章能够帮你解决python double函数_在从Python调用的C函数中使用PyFloat_FromDouble时获得错误结果所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复