type
status
date
slug
summary
tags
category
icon
password
编写一个由 C 语言驱动的 Python 库(通常称为 C 扩展)是提升 Python 性能的关键技能。这听起来可能很复杂,但实际上主要遵循“定义接口 -> 编写胶水代码 -> 编译打包”的流程。
最标准、最原生的方法是使用 CPython API(也称为 CPython 扩展)。以下是基于此方法的详细实操步骤。
📋 第一步:准备工作
在开始之前,请确保你的环境已配置好:
- Python 开发环境:安装 Python(建议 3.6+)。
- 编译器:
- Windows:推荐安装 Visual Studio (Community/Professional) 或 Visual Studio Build Tools。
- Linux/macOS:通常自带
gcc或clang,但需要安装 Python 的头文件(例如 Ubuntu 下需运行sudo apt-get install python3-dev)。
📂 第二步:项目结构与代码编写
我们需要三个核心文件:C 源码文件、头文件和构建脚本。
1. 编写 C 源码 (mylib.c)
这是你的核心算法逻辑。这里我们写一个简单的加法函数。
2. 编写头文件 (mylib.h)
定义函数原型。
3. 编写 Python 绑定代码 (mymodule.c)
这是最关键的一步,即“胶水代码”。它负责将 C 函数转换为 Python 能识别的对象。
⚙️ 第三步:编写构建脚本 (setup.py)
我们需要一个脚本来告诉 Python 如何编译这些 C 代码。
🛠️ 第四步:编译与安装
打开终端(Terminal / CMD),进入你的项目目录,执行以下命令:
1. 生成动态链接库(.so 或 .pyd)
- Windows: 会在当前目录生成
mymodule.cp3x-win_amd64.pyd(即 DLL)。
- Linux/macOS: 会生成
mymodule.cpython-xxx.so。
2. (可选)安装为全局包
如果你希望像安装
numpy 一样安装它:或者更现代的方式是构建 wheel 包:
🚀 第五步:在 Python 中调用
编译成功后,你就可以像使用普通 Python 库一样使用它了。
💡 核心概念速查表
为了帮助你理解上面的 C 代码,这里有几个关键点的解释:
概念 | 说明 |
PyArg_ParseTuple | 用于将 Python 传来的参数元组转换为 C 语言变量。 "ii" 代表两个整数,"s" 代表字符串。 |
PyLong_FromLong | 将 C 语言的 long 类型转换为 Python 的整数对象。 |
PyMODINIT_FUNC | 定义模块初始化函数,这是 Python 解释器加载模块时的入口。 |
METH_VARARGS | 标志位,表示该函数接受位置参数。 |
🔄 替代方案:Cython (推荐初学者)
如果你觉得直接写 C 的胶水代码太繁琐(指针、内存管理容易出错),推荐使用 Cython。
- 写一个
.pyx文件(类似 Python 语法)。
- 用 Cython 编译成 C 代码。
- 再编译成 Python 模块。
它能让你用更接近 Python 的语法获得 C 的速度,且集成度更高。
- 作者:SupraYou
- 链接:http://blog.suprayou.com/%E4%BA%A7%E5%93%81%E7%9C%9F%E7%BB%8F/how-to-use-clang-to-develop-a-python-lib
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
