python调⽤cc++时传递结构体参数背景:使⽤python调⽤linux的动态库SO⽂件,并调⽤⾥边的c函数,向⾥边传递结构体参数。直接上代码
//test1.c
# include <stdio.h>
# include <stdlib.h>
//创建⼀个Student结构体
struct Student
{
char name[30];
float fScore[3];
};
void Display(struct Student su)
{
printf("-----Information------\n");
printf("Name:%s\n",su.name);
printf("Chinese:%.2f\n",su.fScore[0]);
printf("Math:%.2f\n",su.fScore[1]);
printf("English:%.2f\n",su.fScore[2]);
printf("总分数为:%f\n", su.fScore[0]+su.fScore[1]+su.fScore[2]);printf函数的用法python
printf("平均分数为:%.2f\n",((su.fScore[0]+su.fScore[1]+su.fScore[2]))/3);
}
⽣成libpycall.so⽂件:
gcc -o libpycall.so -shared -fPIC test1.c
python调⽤,给Display传递结构体参数:
#pycall.py
import ctypes
from ctypes import *
class Student(Structure):
_fields_ = [("name",c_char * 30),
("fScore", c_float * 3)
]
su = Student()
su.name = b"test-sdk"
PARAM = c_float * 3
fScore = PARAM()
fScore[0] = 55.1
fScore[1] = 33.2
fScore[2] = 51.3
su.fScore = fScore
if__name__ == '__main__':
ll = ctypes.cdll.LoadLibrary
lib = ll("./libpycall.so")
# stype = c_float
lib.Display.argtypes = [Student]  #这⼀⾏很重要
lib.Display(su)
print('----- finish -----')
输出Display函数调⽤结果:
-----Information------
Name:test-sdk
Chinese:55.10
Math:33.20
English:51.30
总分数为:139.600006
平均分数为:46.53
----- finish -----