ctypes 是 Python 标准库的外部函数接口,允许直接调用 C 动态链接库中的函数。
核心价值
- 调用系统 API:Windows Kernel32.dll、Linux libc.so
- 复用 C 库:高性能数学计算、图像处理、硬件驱动
- 跨语言交互:Rust、Fortran 等编译为 C 兼容库
加载动态库
| 加载器 | 调用约定 | 适用平台 |
|---|---|---|
CDLL / cdll | cdecl | Linux/Unix,Windows C 库 |
WinDLL / windll | stdcall | Windows API |
OleDLL / oledll | stdcall (HRESULT) | Windows COM |
| |
函数原型定义
| |
数据类型
基础类型
| ctypes 类型 | C 类型 |
|---|---|
c_int | int |
c_double | double |
c_char_p | char* |
c_void_p | void* |
结构体
| |
数组
| |
指针
| |
回调函数
| |
实战示例
调用自定义 C 库
| |
| |
| |
Windows API
| |
最佳实践
- 类型安全:始终设置
argtypes和restype - 调用约定:Windows 上区分
cdll(cdecl) 和windll(stdcall) - 内存管理:明确 C 函数内分配内存的所有权
- 错误处理:检查返回值,使用
faulthandler调试崩溃 - 跨平台:用
ctypes.util.find_library查找库
替代方案对比
| 技术 | 优点 | 缺点 |
|---|---|---|
| ctypes | 标准库,无需编译 | 性能开销大 |
| CFFI | 更 Pythonic | 需单独安装 |
| Cython | 性能极佳 | 需要编译 |
张芷铭的个人博客
Comments