gpt4 book ai didi

python - 从 Python 调用的 C 函数发出返回值

转载 作者:太空狗 更新时间:2023-10-29 20:16:02 25 4
gpt4 key购买 nike

我很难解决一个看似简单的问题。我需要从 Python 代码调用各种 C 函数。目前,我正在尝试通过 ctypes 来做到这一点。我遇到了一个简单的示例实现问题,我正在使用它来确保在更改大量现有代码之前一切都按预期工作。 C 函数接受一些参数,进行各种数学计算,然后返回一个 double 值。这是我用作测试的 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;
}

在我的实际测试函数中,我正在打印 val1val2 以确保它们正在接收值。在那一端一切都很好。调用此函数的 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 不喜欢返回的结果。

知道我遗漏了什么吗?

最佳答案

您应该使用 argtypesrestype 成员在 Python 中设置函数的参数类型和返回类型:

test.eval.argtypes = [ctypes.POINTER(ctypes.c_double),
ctypes.c_int,
ctypes.POINTER(ctypes.c_double),
ctypes.c_int,
ctypes.c_int]
test.eval.restype = ctypes.c_double

然后你可以像你正在做的那样调用它:构造类型为 (ctypes.c_double * length) 的数组,用你的值初始化,结果 将是一个

另见 ctypes tutorial ,它有很多有用的信息。

关于python - 从 Python 调用的 C 函数发出返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11803121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com