python调用dll
最近项目需要使用python环境下调用c++写的dll文件,鉴于自己对python也是学习不久,中间也遇到很多问题,在此记录,本篇可能会持续更新,结合网上已有的资料结合自己的实际项目,将python调用dll的一些问题问题争取比较全的写下来。
环境
需要调用的dll也是自己写的,功能是从网络相机中获取数据;python就是需要调用dll中的一系列函数,获取数据及显示图像。
python:3.7
加载dll
from ctypes import *
dll = CDLL("./lib/SDKlib.dll")
ctypes 是 Python 的外部函数库。它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的函数。可使用该模块以纯 Python 形式对这些库进行封装。
ctypes 定义了一些和C兼容的基本数据类型:
ctypes类型 | c类型 | python类型 |
---|---|---|
c_bool | _Bool | bool (1) |
c_char | char | 单字符字节对象 |
c_wchar | wchar_t | 单字符字符串 |
c_byte | char | int |
c_ubyte | unsigned char | int |
c_short | short | int |
c_ushort | unsigned short | int |
c_int | int | int |
c_uint | unsigned int | int |
c_long | long | int |
c_ulong | unsigned long | int |
c_longlong | long long | int |
c_ulonglong | unsigned long long | int |
c_size_t | size_t | int |
c_float | float | float |
c_double | double | float |
c_longdouble | long double | float |
c_char_p | char * (以 NUL 结尾) | 字符串对象或NULL |
c_wchar_p | w_char * (以 NUL 结尾) | 字符串对象或NULL |
c_void_p | void * | int或者None |
注:Python 中的类型,除了 None,int, long, Byte String,Unicode String 作为 C 函数的参数默认提供转换外,其它类型都必须显式提供转换。
None:对应 C 中的 NULL
int, long: 对应 C 中的 int,具体实现时会根据机器字长自动适配。
Byte String:对应 C 中的一个字符串指针 char * ,指向一块内存区域。
Unicode String :对应 C 中一个宽字符串指针 wchar_t *,指向一块内存区域。
结构体声明
ctypes 支持结构体的使用,从 Structure 类派生,数据放在 fields 中,
c语言中的结构体声明如下:
typedef