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

我试图弄清楚如何从我在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.Structure的子类,它匹配来自c库的struct re_val

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