gpt4 book ai didi

python - 在 Python 中调用 C 函数并返回 2 个值

转载 作者:太空宇宙 更新时间:2023-11-04 02:25:57 26 4
gpt4 key购买 nike

我想弄清楚如何从我在 python 中调用的 C 函数返回 2 个值。我已经在线阅读了资料,并且正在使用 struct 输出这两个变量。当我在同一 C 文件中调用此函数时,我能够输出变量。然而,当我尝试在 python 中调用它时,它仍然只返回一个值。

这是我的 C 代码:

struct re_val {

double predict_label;
double prob_estimates;

};

struct re_val c_func(const char* dir, double a, double b, double c, double d )
{
double x[] = {a,b,c,d};

printf ("x[0].index: %d \n", 1);
printf ("x[0].value: %f \n", x[0]);

printf ("x[1].index: %d \n", 2);
printf ("x[1].value: %f \n", x[1]);

printf ("x[2].index: %d \n", 3);
printf ("x[2].value: %f \n", x[2]);

printf ("x[3].index: %d \n", 4);
printf ("x[3].value: %f \n", x[3]);

printf ("\nThis is the Directory: %s \n", dir);

struct re_val r;
r.predict_label = 5.0;
r.prob_estimates = 8.0;

return r;

}

这是我的 Python 代码:

calling_function = ctypes.CDLL("/home/ruven/Documents/Sonar/C interface/Interface.so")
calling_function.c_func.argtypes = [ctypes.c_char_p, ctypes.c_double, ctypes.c_double, ctypes.c_double, ctypes.c_double]
calling_function.c_func.restype = ctypes.c_double
q = calling_function.c_func("hello",1.3256, 2.45, 3.1248, 4.215440)
print q

目前,当我在终端中运行我的 python 文件时,它会输出:

x[0].index: 1 
x[0].value: 1.325600

x[1].index: 2
x[1].value: 2.450000

x[2].index: 3
x[2].value: 3.124800

x[3].index: 4
x[3].value: 4.215440

This is the Directory: hello

5.0

相反,我希望它输出这个:

x[0].index: 1 
x[0].value: 1.325600

x[1].index: 2
x[1].value: 2.450000

x[2].index: 3
x[2].value: 3.124800

x[3].index: 4
x[3].value: 4.215440

This is the Directory: hello

5.0
8.0

最佳答案

你的 C 代码没问题,你遇到的问题是你如何使用 python ctypes。您应该告诉该函数返回一个 struct re_val 而不是一个 double:

calling_function.c_func.restype =  ctypes.c_double

上面的代码使得函数在 ctypes 的眼中返回一个单一的 double 值。你应该告诉 python 该函数返回一个结构:

import ctypes as ct

# Python representation of the C struct re_val
class ReVal(ct.Structure):
_fields_ = [("predict_label", ct.c_double),("prob_estimates", ct.c_double)]

calling_function = ctypes.CDLL("/home/ruven/Documents/Sonar/C interface/Interface.so")
calling_function.c_func.argtypes = [ctypes.c_char_p, ctypes.c_double, ctypes.c_double, ctypes.c_double, ctypes.c_double]
# and instead of c_double use:
calling_function.c_func.restype = ReVal

通过这种方式,您可以告诉 python 的 ctypes 该函数返回一个聚合对象,该对象是 ctypes 的子类。与 c 库中的 struct re_val 相匹配的结构。

注意 使用 argtypes 和 restype 时要非常小心,如果你不正确地使用它们,很容易使 python 解释器崩溃。然后你会得到一个段错误而不是一个很好的回溯。

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

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