打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python的学习(三十二)
Python中ctypes的使用整理
ctypesPython的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数。ctypes的官方文档在这里
1. ctypes基本数据类型映射表
参数类型预先设定好,或者在调用函数时再把参数转成相应的c_***类型。ctypes的类型对应如下:
ctypes typeC typePython Type
c_charchar1-character string
c_wcharwchar_t1-character unicode string
c_bytecharint/long
c_ubyteunsigned charint/long
c_boolboolbool
c_shortshortint/long
c_ushortunsigned shortint/long
c_intintint/long
c_uintunsigned intint/long
c_longlongint/long
c_ulongunsigned longint/long
c_longlong__int64 or longlongint/long
c_ulonglongunsigned __int64 or unsigned long longint/long
c_floatfloatfloat
c_doubledoublefloat
c_longdoublelong double floatfloat
c_char_pchar *string or None
c_wchar_pwchar_t *unicode or None
c_void_pvoid *int/long or None
对应的指针类型是在后面加上'_p',如int*是c_int_p等等。在python中要实现c语言中的结构,需要用到类。
2. 加载DLL
访问dll,首先需引入ctypes库
from ctypes import *
假设你已经有了一个的DLL(名字是add.dll),且该DLL有一个符合cdecl(这里强调调用约定是因为,stdcall调用约定和cdecl调用约定声明的导出函数,在使用python加载时使用的加载函数是不同的,后面会有说明)调用约定的导出函数Add。
stdcall调用约定:两种加载方式
Objdll = ctypes.windll.LoadLibrary('dllpath') Objdll = ctypes.WinDLL('dllpath')
cdecl调用约定:也有两种加载方式
Objdll = ctypes.cdll.LoadLibrary('dllpath') Objdll = ctypes.CDLL('dllpath')
其实windll和cdll分别是WinDLL类和CDll类的对象。
3. 调用DLL方法
加载dll后会返回一个DLL对象,使用其中的函数方法则相当于操作该对象的对应属性。
注意,经过stdcall声明的方法,如果不是用def文件声明的导出函数或者extern “C” 声明的话,编译器会对函数名进行修改
函数参数申明,通过设置函数的argtypes属性
函数返回类型,函数默认返回c_int类型,如果需要返回其他类型,需要设置函数的restype属性
4. 指针与引用
常用的通过调用ctypes类型的指针函数来创建指针实例:
from ctype import *i = c_int(1)pi = POINTER(i)
对指针实例赋值只会改变其指向的内存地址,而不是改变内存的内容,与其他语言类似,如需要可改变内容的字符串,可须使用create_string_buffer()
>>> p = create_string_buffer('Hello', 10) # create a 10 byte buffer>>> print sizeof(p), repr(p.raw)10 'Hello/x00/x00/x00/x00/x00'
不带参数的调用指针类型创建一个NULL指针, NULL指针有一个False布尔值
>>> null_ptr = POINTER(c_int)() >>> print bool(null_ptr) False
指针实例有一个contents属性,返回这个指针所指向的对象。
另外,byref()是用来传递引用参数,pointer()作为传参通常会创建一个实际的指针对象,当不需要实际指针对象时,则可使用byref()
5. 结构体类型处理
Structures和Unions必须继承Structure和Union基础类,它们都在ctypes模块中定义,每一个子类必须定义个_fields_属性,_fields_是一个二维的tuples列表,包含着每个field的name及type,这field类型必须是一个ctypes类型,如c_int,或者任何其他的继承ctypes的类型,如Structure, Union, Array, 指针等。
例如有一个简单结构,包含两个整型x和y,可如下初始化一个结构:
from ctypes import *import typesclass Test(Structure): _fields_ = [('x', c_int), ('y', c_char)]test1 = Test(1, 2)
另外,如结构体用于链表操作,即包含指向结构体指针时,若直接定义:
from ctypes import *import typesclass Test(Structure): _fields_ = [('x', c_int), ('y', c_char), ('next', Test)]
则python会报错type未定义,:
from ctypes import *import typesclass Test(Structure): passTest._fields_ = [('x', c_int), ('y', c_char), ('next', POINTER(Test))]
6. 数组定义
数组包含一个固定数目的相同类型的实例,常用创建数组类型是对一个数据类型与一个正数相乘,例如:
ArrayType = Test * 10
初始化和使用数组:>>> from ctypes import *>>> TenIntegers = c_int * 10>>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)>>> print ii>>> for i in ii: print i,
7. 回调函数
ctypes可以从python可调用对象中创建一个c可调用的函数指针,这些通常被称为回调函数。
(这个等用到时,再仔细研究。。。)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python调用windows下DLL详解 - ctypes库的使用
使用 Python 的 ctypes 调用 C 的动态库
Python使用ctypes模块调用DLL函数之传递数值、指针与字符串参数
Python调用windows下DLL详解
python3.7使用ctypes调用dll函数(含指向数组的指针)
ctypes 使用方法与说明
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服