python和c语言进行数据交互,涉及类型转换,字节对齐,字节序大小端转换等。相关模块ctypes,struct,memoryview。
一.ctypes:python和c语言使用结构体数据进行交互
场景:有一个C语言生成的动态链接库,python需要调用动态库里的函数处理数据。函数的入参是结构体类型的指针,出参是一个buffer,那么如何把python的数据转换成c语言中的结构体类型?
1.ctypes的使用
C语言代码如下
#include <stdio.h>
typedef struct student{
char name;
short class;
double num;
int age;
}stu;
typedef struct stu_struct_array{
stu stu_array[2];
}stu_struct_array_t;
int struct_test(stu *msg, stu_struct_array_t *nest_msg, char *buff){
int index = 0;
printf("stu name: %dn", msg->name);
printf("stu class: %dn", msg->class);
printf("stu num: %fn", msg->num);
printf("stu age: %dn", msg->age);
memcpy(nest_msg->stu_array, msg, sizeof(stu));
printf("stu array index 0 name: %dn", nest_msg->stu_array[0].name);
printf("stu array index 0 class: %dn", nest_msg->stu_array[0].class);
memcpy(buff, msg, sizeof(stu));
printf("buff: %d %d", buff[0], buff[1]);
return 1;
}
通过-fPIC -shared选项生成动态链接库,编译命令gcc -Wall -g -fPIC -shared -o libstruct.so.0 struct_array.c
此时需要通过python调用struct_test()
函数,那么如何利用python传入结构体参数呢?
方法就是利用ctypes模块组装结构体(1)首先是结构体的组装
ctypes定义了一些和C兼容的基本数据类型: