ctypes是Python的一个外部库,可以使用python语言调用编译好的C语言函数和数据类型,进行数据交换。 ctypes 的官方文档位于 https://docs.python.org/3/library/ctypes.html
1、ctypes基本数据类型映射表
2、python调用c语言的函数库
(1)生成c语言函数
#Step 1: test.c
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
(2)编译动态链接库生成 libtest.so文件(DLL)
gcc -fPIC -shared test.c -o libtest.so
(3)调用DLL文件
#Step 3: test.py
from ctypes import *
mylib = CDLL("libtest.so")或者cdll.LoadLibrary("libtest.so")
add = mylib.add
add.argtypes = [c_int, c_int] # 参数类型,两个int(c_int是ctypes类型,见上表)
add.restype = c_int # 返回值类型,int (c_int 是ctypes类型,见上表)
sum = add(3, 6)
3、指针和引用
对指针实例的赋值只会改变它指向的内存地址,不会改变内存的内容。指针实例有一个 contents 属性,它返回指针指向的对象。
from ctype import *
i = c_int(1)
pi = POINTER(c_int)(i)
pi2 = pointer(i)
print pi.contents #返回指针指向对象的值
print pi2.contents
pointer 和 POINTER 的区别是,pointer 返回一个实例,POINTER 返回一个类型。
4、结构类型数据
Structures 和 Unions 必须继承 Structure 和 Union 的基本类,它们定义在 ctypes 模块中。每个子类都必须定义一个 fields 属性。 Fields 是一个二维元组列表,包括每个字段的名称和类型。类型必须是 ctypes 类型,例如 c_int,或任何其他继承 ctypes 的类型,例如 Structure、Union、Array、pointer 等。
from ctypes import *
import types
class Test(Structure):
_fields_ = [('x', c_int),('y', c_char)]
test1 = Test(1, 2)
如果该结构体用于链表操作,即包含指向该结构体的指针时,需要定义如下:
from ctypes import *
import types
class Test(Structure):
pass
Test._fields_ = [('x', c_int),('y', c_char),('next', POINTER(Test))]
python学习网,大量的免费
,欢迎在线学习!
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何解决python的replace语句错误12/07
- ♥ python中的idle如何工作09/14
- ♥ 如何在 python 中使用 pandas.merge?10/10
- ♥ getenv如何在python3 os中获取变量?10/15
- ♥ python中MongoDB的增删改查12/13
- ♥ 什么是UDP,UDP协议和优缺点10/22
内容反馈