python ctypes 指针_聊聊Python ctypes 模块

本文详细介绍了Python的ctypes模块,它是Python调用动态链接库的内置工具,支持Python与C/C++混合编程。ctypes通过类型映射在Python和C类型间转换,允许直接调用二进制动态链接库。文章讨论了ctypes的原理、优缺点,并通过实例展示了如何使用ctypes调用C函数,包括基本类型映射、数组、指针和函数指针的处理。此外,还提供了在Windows、Linux和Mac OS X上调用动态链接库的例子。
摘要由CSDN通过智能技术生成

摘要:模块ctypes是Python内建的用于调用动态链接库函数的功能模块,一定程度上可以用于Python与其他语言的混合编程。由于编写动态链接库,使用C/C++是最常见的方式,故ctypes最常用于Python与C/C++混合编程之中。

=================================================================

1. ctypes 的原理以及优缺点

从ctypes的文档中可以推断,在各个平台上均使用了对应平台动态加载动态链接库的方法,并通过一套类型映射的方式将Python与二进制动态链接库相连接。通过阅读ctypes本身的代码也可以印证这个推断(/Modules/_ctypes/_ctypes.c和/Modules/_ctypes/callproc.c)。在Windows平台下,最终调用的是Windows API中LoadLibrary函数和GetProcAddress函数,在Linux和Mac OS X平台下,最终调用的是Posix标准中的dlopen和dlsym函数。ctypes 实现了一系列的类型转换方法,Python的数据类型会包装或直接推算为C类型,作为函数的调用参数;函数的返回值也经过一系列的包装成为Python类型。也就是说,PyObject* <-> C types的转换是由ctypes内部完成的,这和SWIG是同一个原理。

从ctypes的实现原理不难看出:

ctypes 有以下优点:Python内建,不需要单独安装

可以直接调用二进制的动态链接库

在Python一侧,不需要了解Python内部的工作方式

在C/C++一侧,也不需要了解Python内部的工作方式

对基本类型的相互映射有良好的支持

ctypes 有以下缺点:平台兼容性差

不能够直接调用动态链接库中未经导出的函数或变量

对C++的支持差

就个人的经验来看,ctypes 适合于“中轻量级”的Python C/C++混合编程。特别是遇到第三方库提供动态链接库和调用文档,且没有编译器或编译器并不互相兼容的场合下,使用ctypes特别方便。值得注意的是,对于某种需求,在Python本身就可以实现的情况下(例如获取系统时间、读写文件等),应该优先使用Python自身的功能而不要使用操作系统提供的API接口,否则你的程序会丧失跨平台的特性。

2. 一个简单的例子

作为Python文档的一部分,ctypes 提供了完善的文档。但没有Windows API编程经验的初学者读ctypes文档仍然会晕头转向。这里举一个小例子,尽力避开Windows API以及POSIX本身的复杂性,读者只需要了解C语言即可。

在尝试本节例子之前,依然要搭建Python扩展编程环境。见 搭建Python扩展开发环境 - 蛇之魅惑 - 知乎专栏

首先我们写一个C语言的小程序,然后把它编译成动态链接库。

//great_module.c#include

#ifdef _MSC_VER #define DLL_EXPORT __declspec( dllexport )#else #define DLL_EXPORT#endif

DLL_EXPORT int great_function(unsigned int n) {

return _mm_popcnt_u32(n);

}

这个源文件中只有一个函数 great_function,它会调用Intel SSE4.2指令集的POPCNT指令(封装在_mm_popcnt_u32中),即计算一个无符号整数的二进制表示中“1”的个数。如果你的电脑是2010年前购买的,那么很可能不支持SSE4.2指令集,你只需要把return这一行改为 return n+1;即可,同样能够说明问题。

调用_mm_popcnt_u32需要包含Intel 指令集头文件nmmintrin.h,它虽然不是标准库的一部分,但

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值