当前位置: 首页 > news >正文

Python 高手编程系列六十六:ctypes

ctypes 是最流行的模块,用于动态或共享库的函数调用,而不需要编写自定义 C 扩展。
原因很明显。它是标准库的一部分,因此它始终可用,并且不需要任何外部依赖。它是一个外部
函数接口(Foreign Function Interface,FFI)库,并提供了一个用于创建兼容 C 数据类型的 API。
加载库
在 ctypes 中有 4 种类型的动态库加载器和两个使用它们的约定。表示动态和共享库的
类是 ctypes.CDLL、ctypes.PyDLL、ctypes.OleDLL 和 ctypes.WinDLL。最后两个
仅在 Windows 上可用,因此我们不在这里讨论它们。CDLL 和 PyDLL 之间的区别如下。
● ctypes.CDLL:此类表示加载共享库。这些库中的函数使用标准调用约定,并假
定返回 int 类型。GIL 在调用期间释放。
● ctypes.PyDLL:此类工作类似于 CDLL,但 GIL 在调用期间不释放。执行后,将
检查 Python 错误标志,如果设置了异常,就会抛出。它只在从 Python/C API 中直
接调用函数时有用。
要加载库,可以使用适当的参数实例化前面的一个类,或者从与特定类关联的子模块
中调用 LoadLibrary()函数。
● 对于 ctypes.CDLL 使用 ctypes.cdll.LoadLibrary()。
● 对于 ctypes.PyDLL 使用 ctypes.pydll.LoadLibrary()。
● 对于 ctypes.WinDLL 使用 ctypes.windll.LoadLibrary()。
● 对于 ctypes.OleDLL 使用 ctypes.oledll.LoadLibrary()。
加载共享库的主要挑战是如何以便携式方式找到它们。不同的系统对共享库使用不同的后
缀(Windows 上是.dll,OS X 上是.dylib,Linux 上是.so),并在不同的地方搜索它们。在
这个领域,Windows 的处理方式不太符合常规,对于库,它没有一个预定义的命名模式。因此,
我们不会讨论在这个系统上使用 ctypes 加载库的细节,主要集中在以一致和类似的方式处理
这个问题的 Linux 和 Mac OS X 上。如果你对 Windows 平台感兴趣,请参考官方 ctypes 文档,
这些文档有关支持该系统的大量的信息(参考 https://docs.python.org/ 3.5/library/ctypes.html)。
两个库加载约定(LoadLibrary()函数和特定的 librarytype 类)要求你使用完
整的库名称。这意味着需要包括所有预定义的库前缀和后缀。例如,要在 Linux 上加载 C
标准库,你需要编写以下内容:

import ctypes
ctypes.cdll.LoadLibrary(‘libc.so.6’)
<CDLL ‘libc.so.6’, handle 7f0603e5f000 at 7f0603d4cbd0>
这里,在 Mac OS X 上,应该这样:
import ctypes
ctypes.cdll.LoadLibrary(‘libc.dylib’)
幸运的是,ctypes.util 子模块提供了一个 find_library()函数,允许使用其名称加
载库而不带任何前缀或后缀,并且可以在任何具有用于命名共享库的预定义方案的系统上
工作,如下所示:
import ctypes
from ctypes.util import find_library
ctypes.cdll.LoadLibrary(find_library(‘c’))
<CDLL ‘/usr/lib/libc.dylib’, handle 7fff69b97c98 at 0x101b73ac8>
ctypes.cdll.LoadLibrary(find_library(‘bz2’))
<CDLL ‘/usr/lib/libbz2.dylib’, handle 10042d170 at 0x101b6ee80>
ctypes.cdll.LoadLibrary(find_library(‘AGL’))
<CDLL ‘/System/Library/Frameworks/AGL.framework/AGL’, handle 101811610 at
0x101b73a58>
使用 ctypes 调用 C 函数
当库成功加载时,通用的模式是将其存储为与库名称相同的模块级变量。函数可以作为对
象属性访问,因此调用它们就像调用从任何其他导入模块导入的 Python 函数一样,如下所示:
import ctypes
from ctypes.util import find_library

libc = ctypes.cdll.LoadLibrary(find_library(‘c’))

libc.printf(b"Hello world!\n")
Hello world!
13
不幸的是,除了整数,字符串和字节之外的所有内置 Python 类型都与 C 数据类型不兼
容,因此必须使用 ctypes 模块提供的相应类进行包装。表 7-1 是来自 ctypes 文档的兼
容数据类型的完整列表。
表 7-1
ctypes 类型
C 类型
Python 类型
c_bool
_Bool
bool (1)
c_char
char
单字符 bytes 对象
ctypes 类型
C 类型
Python 类型
c_wchar
wchar_t
单字符 string
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
__int64 or long long
int
c_ulonglong
unsigned __int64 or unsigned long long
int
c_size_t
size_t
int
c_ssize_t
ssize_t or Py_ssize_t
int
c_float
float
float
c_double
double
float
c_longdouble
long double
float
c_char_p
char * (NUL terminated)
bytes 对象 或 None
c_wchar_p
wchar_t * (NUL terminated)
string 或 None
c_void_p
void *
int 或 None
如你所见,上表不包含任何将 Python 集合映射成 C 数组的专用类型。为 C 数组创建
类型的推荐方法是简单地使用带有所需基本 ctypes 类型的乘法运算符,如下所示:
import ctypes
IntArray5 = ctypes.c_int * 5
c_int_array = IntArray5(1, 2, 3, 4, 5)
FloatArray2 = ctypes.c_float * 2
c_float_array = FloatArray2(0, 3.14)
c_float_array[1]

http://www.jsqmd.com/news/1001609/

相关文章:

  • 向量空间 JBoltAI:Skill 构建与智能体开发解析
  • 硬件安全处理器MPC184架构解析与嵌入式系统集成实战
  • Claude手搓的IntelliJ Git扩展插件上线
  • 2026年大学规划:在校生可以考的证书有哪些?系统提升职业能力的进阶路径与系统方法全解析
  • ops-transformer算子库——Transformer架构在昇腾NPU上的深度优化实现
  • WaveTools:全面解锁《鸣潮》游戏潜能的专业工具箱
  • Unity游戏马赛克移除技术深度解析:基于BepInEx插件框架的视觉优化方案
  • 四川华锐净化工程有限公司简介及企业资质证书展示|成都本地17年的老牌洁净室工程公司 - 哈尺大哥
  • 艾尔登法环存档救星:EldenRingSaveCopier终极角色迁移指南
  • 顺序表详解
  • UltraStar Deluxe免费K歌软件完整指南:3步打造专业家庭KTV系统
  • 2026年 筷子套厂家推荐排行榜:一次性、淋膜、牛皮纸、彩印定制筷子套源头厂家专业实力与品质之选 - 品牌发掘
  • Python 高手编程系列八十八:微观分析
  • Python 爬虫项目:技术博客全站文章采集
  • 逆向实战:用Node.js模拟浏览器环境,搞定拼多多等平台的anti_content签名
  • Claude Fable 5调试bug展超强能力,AI编程智能体安全隐患引反思
  • 终极免费指南:3分钟解锁网易云音乐NCM格式,实现跨设备音乐自由
  • 东莞搬家公司收费透明吗?了解这些细节避免陷阱 - 从来都是英雄出少年
  • EPPlus架构解析:构建企业级Excel处理引擎的工程实践
  • VC6环境下可直接编译运行的MFC图形化PING工具完整工程包
  • 2026 东莞汽车音响改装行业标杆:虎门杰生 31 年深耕,全维度定义行业绝对天花板 - 汽车音响改装
  • 解锁创意自由:Adobe-GenP 3.0如何为设计师提供一站式解决方案
  • 2026论文降AIGC平台:11款工具实测谁在“智能”谁在“智障”?
  • 2026 西安靠谱婚介精选榜单出炉!6 家合规优质婚恋机构,木槿之约帮单身高效安心脱单 - 星际AI
  • PostgreSQL 技术日报 (6月12日)|自研云原生 PG 平台,AI 开源共享协议发布
  • Spreadsheet Is All You Need性能优化终极指南:三步解决大型计算导致的系统冻结问题
  • Visual Studio Code(微软代码编辑器)
  • 嵌入式Linux入门实战:基于i.MX23 EVK的硬件架构与BSP深度解析
  • Go周刊2026W23 | Go 1.26.4安全更新、GopherCon八月双会、《学习 Go》第3版、Hugo 0.162.0 AVIF支持、Heimdall 7.2发布
  • Fast DDS配置避坑指南:DomainParticipant的QoS设置与Listener监听器实战详解