Python与C交互
python作为一门脚本语言,其好处是语法简单,很多东西都已经封装好了,直接拿过来用就行,所以实现同样一个功能,用Python写要比用C/C++代码量会少得多。但是优点也必然也伴随着缺点(这是肯定的,不然还要其他语言干嘛),python最被人诟病的一个地方可能就是其运行速度了。这这是大部分脚本语言共同面对的问题,因为没有编译过程,直接逐行执行,所以要慢了一大截。所以在一些对速度要求很高的场合,一般
·
python作为一门脚本语言,其好处是语法简单,很多东西都已经封装好了,直接拿过来用就行,所以实现同样一个功能,用Python写要比用C/C++代码量会少得多。但是优点也必然也伴随着缺点(这是肯定的,不然还要其他语言干嘛),python最被人诟病的一个地方可能就是其运行速度了。这这是大部分脚本语言共同面对的问题,因为没有编译过程,直接逐行执行,所以要慢了一大截。所以在一些对速度要求很高的场合,一般都是使用C/C++这种编译型语言来写。
1 python
#!/usr/bin/python3
import os
import ctypes
from ctypes import *
dir = os.getcwd()
file2 = os.path.join(dir, "libtest.so")
libtest = cdll.LoadLibrary(file2)
libtest.test()
# 传递字符数组
temp = c_char * 10
buffer = temp()
for i in range(10):
buffer[i] = b'a'
res = libtest.print_str(pointer(buffer))
# 传递整形、整形指针
buffer=10
a = c_int(buffer)
buffer=20
b = c_int(buffer)
libtest.add(a, b)
libtest.add_p(pointer(a), pointer(b))
# 传递结构体、结构体指针
class user_struct_def(Structure):
_fields_ = [('param1', c_int), ('param2', c_int), ('param3', c_char * 20)]
user_struct = user_struct_def()
user_struct.param1 = 1
user_struct.param2 = 1
user_struct.param3 = b'hello world'
libtest.test2(pointer(user_struct))
libtest.test3(user_struct)
# python 调用c函数默认返回值为int 其他类型需转化
a = c_float(12.7)
b = c_float(2.2)
libtest.test4.restype = ctypes.c_float
res = libtest.test4(a, pointer(b))
print(res)
# python 中数据转化为c语言数据(使用c_float() C_short()类型转化)
a = 22400.1
a = a + 1
temp1 = c_float(a)
b = 10.5
b = b + 1
temp2 = c_float(b)
libtest.test4.restype = ctypes.c_float
res = libtest.test4(temp1, pointer(temp2))
print(res)
# python 元组 列表 字符串转c数组
a = (1, 2, 3, 4, 5, 6, 7, 8)
temp = c_int * 20
buffer = temp()
for i in range(len(a)):
buffer[i] = c_int(a[i])
temp = "hello world"
a = bytes(temp, "utf-8")
print(a)
temp = c_char * 20
buffer = temp()
for i in range(len(a)):
buffer[i] = a[i]
res = libtest.print_str(pointer(buffer))
2 c语言
#include "stdio.h"
struct user_struct_def
{
int a;
int b;
char c[20];
};
void test(void)
{
printf("test\r\n");
}
int print_str(unsigned char *p)
{
printf("print_str=%s\r\n",p);
return 1;
}
int add(int a, int b)
{
int ret;
ret=a+b;
printf("add=a+b=%d\r\n",ret);
return ret;
}
int add_p(int *a,int *b)
{
int c=0;
c=*a+*b;
printf("add_p=%d\r\n",c);
return c;
}
int test2(struct user_struct_def *user_struct)
{
printf("user_struct.a=%d\r\n",user_struct->a);
printf("user_struct.b=%d\r\n",user_struct->b);
printf("user_struct.c=%s\r\n",user_struct->c);
return 1;
}
int test3(struct user_struct_def user_struct)
{
printf("user_struct.a=%d\r\n",user_struct.a);
printf("user_struct.b=%d\r\n",user_struct.b);
printf("user_struct.c=%s\r\n",user_struct.c);
return 1;
}
float test4(float a,float*b)
{
float res;
res=a+*b;
return res;
}
更多推荐



所有评论(0)