一文读懂:Windows / Linux / Buildroot 嵌入式 生成 Python C 扩展(.pyd/.so)
·
全程实战代码 + 逐行注解,不讲废话,直接可用
统一说明
- Windows 输出:
.pyd - Linux PC / 服务器 输出:
.so - 嵌入式 Buildroot(RK3588/Hi3518) 输出:ARM 架构
.so - 三者 C 代码 100% 完全相同,仅编译方式不同
一、通用 C 扩展代码(全平台通用)
文件名:myexample.c
c
运行
// 必须包含:Python 官方提供的 C 语言扩展头文件
#include <Python.h>
// ======================
// C 函数:给 Python 调用
// ======================
static PyObject* add(PyObject* self, PyObject* args)
{
int a, b;
// 解析 Python 传入的参数
// "ii" 表示接收两个 int
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL; // 参数解析失败返回 NULL
}
// C 语言计算后,转回 Python 的整数类型
return PyLong_FromLong(a + b);
}
// ======================
// 方法表:Python 可调用的函数列表
// ======================
static PyMethodDef MyExampleMethods[] = {
// {Python方法名, C函数指针, 参数格式, 说明}
{"add", add, METH_VARARGS, "Add two numbers"},
// 结束符,必须写
{NULL, NULL, 0, NULL}
};
// ======================
// 模块定义结构体
// ======================
static struct PyModuleDef MyExampleModule = {
PyModuleDef_HEAD_INIT, // 固定宏
"myexample", // 模块名 import myexample
"A simple C extension", // 模块说明
-1, // 无独立内存
MyExampleMethods // 方法表
};
// ======================
// 模块初始化函数
// 名字必须是:PyInit_模块名
// ======================
PyMODINIT_FUNC PyInit_myexample(void)
{
return PyModule_Create(&MyExampleModule);
}
二、通用 setup.py(全平台通用)
python
运行
from setuptools import setup, Extension
# 定义 C 扩展模块
module = Extension(
name="myexample", # 模块名
sources=["myexample.c"] # C 源码文件
)
# 执行编译
setup(
name="myexample",
version="1.0",
ext_modules=[module]
)
三、Windows 平台生成 .pyd
1. 安装依赖
bash
运行
pip install setuptools
2. 编译命令
bash
运行
python setup.py build_ext --inplace
3. 输出文件
plaintext
myexample.cp311-win_amd64.pyd
4. Python 调用
python
运行
import myexample
print(myexample.add(10, 20)) # 输出 30
5. 关键说明
.pyd= Windows 版 Python C 扩展- 本质是 DLL 动态库
- 可直接
import调用 - 之前遇到的
_sqlite3.pyd就是这种文件
四、Linux PC 平台生成 .so
1. 安装依赖
bash
运行
sudo apt install python3-dev gcc
2. 编译命令
bash
运行
python3 setup.py build_ext --inplace
3. 输出文件
plaintext
myexample.cpython-310-x86_64-linux-gnu.so
4. Python 调用
python
运行
import myexample
print(myexample.add(10, 20))
5. 关键说明
.so= Linux 版.pyd- 代码 完全不改
- 原理、结构、调用方式 100% 相同
五、嵌入式 Buildroot 交叉编译(RK3588 / Hi3518)
重点:在 PC 上编译 → 输出 ARM 架构 .so
1. 确认交叉编译器(来自 Buildroot)
示例路径(按自己环境修改):
plaintext
/home/your/buildroot/output/host/bin/aarch64-buildroot-linux-gnu-gcc
2. 导出交叉编译环境变量
bash
运行
export CC=aarch64-buildroot-linux-gnu-gcc
export PYTHON_INC=/home/your/buildroot/output/target/usr/include/python3.11/
export PYTHON_LIB=/home/your/buildroot/output/target/usr/lib/python3.11/
3. 交叉编译命令
bash
运行
python3 setup.py build_ext --inplace \
--include-dirs=$PYTHON_INC \
--library-dirs=$PYTHON_LIB \
--cross-compile
4. 输出 ARM 格式 .so
plaintext
myexample.cpython-311-aarch64-linux-gnu.so
5. 放到开发板中调用
python
运行
import myexample
print(myexample.add(10, 20))
6. 关键说明
- Buildroot 编译 Python 时自动生成:
Python.h+ 库 - 交叉编译 = PC 上生成 ARM 可执行文件
- 嵌入式 Python import
.so直接调用 C 语言 - _sqlite3.so、paho-mqtt、numpy 都是这样来的
六、三者关系(终极总结)
Windows:
plaintext
.py → import → .pyd(C 扩展) → .dll(C 实现)
Linux PC:
plaintext
.py → import → .so(C 扩展) → .so(C 实现)
嵌入式 Buildroot:
plaintext
.py → import → ARM .so(C 扩展) → ARM .so(C 实现)
一句话原理
C 代码全平台通用Windows 叫 .pydLinux 叫 .so都是 Python 与 C 语言之间的胶水层
更多推荐

所有评论(0)