使用ctypes实现python类型和C语言类型之间的相互转化,,楔子我们知道可以使用
使用ctypes实现python类型和C语言类型之间的相互转化,,楔子我们知道可以使用
楔子
我们知道可以使用ctypes调用扩展模块,主要是调用扩展模块中使用C编写好的函数,但这些函数肯定都是需要参数的,还有返回值,不然编写扩展模块有啥用呢。那么问题来了,不同的语言变量类型不同,所以python能够直接往C编写的函数中传参吗?显然不行,所以ctypes还提供了大量的类,帮我们将python中的类型转成C语言中的类型。
python类型与C语言类型之间的转换
我们说了,python中类型不能直接往C语言的函数中传递(整型是个例外),那么ctypes就提供了很多的类可以帮助我们将python的类型转成C语言的类型。常见的类型分为以下几种:数值、字符、指针
数值类型转换
c语言的数值类型分为如下:
int:整型unsigned int:无符号整型short:短整型unsigned short:无符号短整型long:长整形unsigned long:无符号长整形long long:64位机器上等同于longunsigned long long:等同于unsigned longfloat:单精度浮点型double:双精度浮点型long double:看成是double即可_Bool:布尔类型ssize_t:等同于long或者long longsize_t:等同于unsigned long或者unsigned long longimport ctypes# 下面都是ctypes中提供的类,将python中的对象传进去,就可以转换为C语言能够识别的类型print(ctypes.c_int(1)) # c_long(1)print(ctypes.c_uint(1)) # c_ulong(1)print(ctypes.c_short(1)) # c_short(1)print(ctypes.c_ushort(1)) # c_ushort(1)print(ctypes.c_long(1)) # c_long(1)print(ctypes.c_ulong(1)) # c_ulong(1)# c_longlong等价于c_long,c_ulonglong等价于c_ulongprint(ctypes.c_longlong(1)) # c_longlong(1)print(ctypes.c_ulonglong(1)) # c_ulonglong(1)print(ctypes.c_float(1.1)) # c_float(1.100000023841858)print(ctypes.c_double(1.1)) # c_double(1.1)# 在64位机器上,c_longdouble等于c_doubleprint(ctypes.c_longdouble(1.1)) # c_double(1.1)print(ctypes.c_bool(True)) # c_bool(True)# 相当于c_longlong和c_ulonglongprint(ctypes.c_ssize_t(10)) # c_longlong(10)print(ctypes.c_size_t(10)) # c_ulonglong(10)
字符类型转换
c语言的字符类型分为如下:
char:一个ascii字符或者-128~127的整型wchar:一个unicode字符unsigned char:一个ascii字符或者0~255的一个整型import ctypes# 必须传递一个ascii字符并且是字节,或者一个int,来代表c里面的字符print(ctypes.c_char(b"a")) # c_char(b'a')print(ctypes.c_char(97)) # c_char(b'a')# 传递一个unicode字符,当然ascii字符也是可以的,并且不是字节形式print(ctypes.c_wchar("憨")) # c_wchar('憨')# 和c_char类似,但是c_char既可以传入字符、也可以传整型,而这里的c_byte则要求必须传递整型。print(ctypes.c_byte(97)) # c_byte(97)print(ctypes.c_ubyte(97)) # c_ubyte(97)
指针类型转换
c语言的指针类型分为如下:
char *:字符指针wchar_t *:字符指针void *:空指针import ctypes# c_char_p就是c里面字符数组指针了# char *s = "hello world";# 那么这里面也要传递一个bytes类型的字符串,返回一个地址print(ctypes.c_char_p(b"hello world")) # c_char_p(2082736374464)# 直接传递一个unicode,同样返回一个地址print(ctypes.c_wchar_p("憨八嘎~")) # c_wchar_p(2884583039392)# ctypes.c_void_p后面演示
至于其他的类型,比如整型指针啊、数组啊、结构体啊、回调函数啊,ctypes都支持,我们后面会介绍。
使用ctypes实现python类型和C语言类型之间的相互转化
相关内容
- 调用百度ocr的API,python简易版本,,调用百度ocr的AP
- 聚类算法总结以及python代码实现,,一、聚类(无监督)
- Python---基础知识,,一 、变量变量是表示
- Python3.7之抽象类与归一化,,Python3.7之
- Python (从数据类型~字典)的测试题,,Python基础数据
- Python Cookbook(第3版) 中文版 pdf完整版高清下载,,Python
- Python深度学习自然语言处理工具Stanza试用!这也太强大
- ubuntu18.04安装多版本python及管理,,20200609部分
- python函数编程,,一、python函数
- Python内置函数之any(),,any()函数和al
评论关闭