您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

【Python】聊聊Python ctypes 模块

5b51 2022/1/14 8:25:21 python 字数 5270 阅读 931 来源 www.jb51.cc/python

作者:JerryJho, 链接:https://zhuanlan.zhihu.com/p/20152309 来源:知乎摘要:模块ctypes是Python内建的用于调用动态链接库函数的功能模块,一定程度上可以用于Python与其他语言的混合编程。由于编写动态链接库,

概述

作者:Jerry Jho,

链接https://zhuanlan.zhihu.com/p/20152309

来源:知乎

摘要:模块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 有以下优点:

ctypes 有以下缺点:

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

2. 一个简单的例子

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

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

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

<span class="cp">#ifdef _MSC_VER
<span class="cp">#define DLL_EXPORT __declspec( dllexport )
<span class="cp">#else
<span class="cp">#define DLL_EXPORT
<span class="cp">#endif

<span class="n">DLL_EXPORT <span class="kt">int <span class="nf">great_function<span class="p">(<span class="kt">unsigned <span class="kt">int <span class="n">n<span class="p">) <span class="p">{
<span class="k">return <span class="n">_mm_popcnt_u32<span class="p">(<span class="n">n<span class="p">);
<span class="p">}

总结

以上是编程之家为你收集整理的【Python】聊聊Python ctypes 模块全部内容,希望文章能够帮你解决【Python】聊聊Python ctypes 模块所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶