【发布时间】:2012-08-03 20:50:37
【问题描述】:
我在一个看似简单的问题上遇到了困难。我需要从 Python 代码中调用各种 C 函数。目前,我正在尝试通过 ctypes 来做到这一点。我在使用一个简单的示例实现时遇到问题,我使用它来确保在更改大量现有代码之前一切都按预期工作。 C 函数接受一些参数,进行各种数学计算,然后返回一个双精度值。这是我用作测试的 C 文件。
#include "Python.h"
double eval(double* args, int length, double* rands, int randLength, int debug)
{
double val1 = args[0];
double val2 = rands[0];
double ret = val1 + val2;
return ret;
}
在我的实际测试函数中,我正在打印 val1 和 val2 以确保它们接收到值。在那方面一切都很好。调用这个函数的Python如下。
test = ctypes.CDLL("/home/mjjoyce/Dev/C2M2L/AquaticWavesModel.so")
rand = Random();
args = [2]
argsArr = (ctypes.c_double * len(args))()
argsArr[:] = args
argsRand = [rand.random()]
argsRandArr = (ctypes.c_double * len(argsRand))()
rgsRandArr[:] = argsRand
result = test.eval(argsArr, len(argsArr), argsRandArr, len(argsRandArr), 0)
print "result", result
当它打印返回的结果时,它通常会转储一个很大的负数。我的假设是我需要在 Python 处理该值之前进行一些转换,但我一生都找不到答案。我一直在搜索,但我不确定我是否遗漏了明显的信息,或者搜索了错误的信息。
另外,如果我将函数的返回类型更改为 int,则计算结果会正确,并且会按预期返回并打印一个 int。如果我将其设置为 double,则 C 代码中的计算是正确的(我打印出来检查),但 Python 不喜欢返回的结果。
任何想法我错过了什么?
【问题讨论】: