[英]Calling a C function in Python and returning 2 values
我试图弄清楚如何从我在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
上面的代码使函数在ctype的眼中返回单个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的子类。 struct re_val
与c库中的struct re_val
相匹配。
注意小心使用argtypes和restype,如果使用不当,很容易使python解释器崩溃。 然后,您将得到一个段错误而不是很好的回溯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.