一文读懂:Windows / Linux / Buildroot 嵌入式 生成 Python C 扩展(.pyd/.so)

张开发
2026/4/19 16:20:20 15 分钟阅读

分享文章

一文读懂:Windows / Linux / Buildroot 嵌入式 生成 Python C 扩展(.pyd/.so)
全程实战代码 逐行注解不讲废话直接可用统一说明Windows输出.pydLinux PC / 服务器输出.so嵌入式 BuildrootRK3588/Hi3518输出ARM 架构.so三者 C 代码 100% 完全相同仅编译方式不同一、通用 C 扩展代码全平台通用文件名myexample.cc运行// 必须包含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( namemyexample, # 模块名 sources[myexample.c] # C 源码文件 ) # 执行编译 setup( namemyexample, version1.0, ext_modules[module] )三、Windows 平台生成 .pyd1. 安装依赖bash运行pip install setuptools2. 编译命令bash运行python setup.py build_ext --inplace3. 输出文件plaintextmyexample.cp311-win_amd64.pyd4. Python 调用python运行import myexample print(myexample.add(10, 20)) # 输出 305. 关键说明.pyd Windows 版 Python C 扩展本质是DLL 动态库可直接import调用之前遇到的_sqlite3.pyd就是这种文件四、Linux PC 平台生成 .so1. 安装依赖bash运行sudo apt install python3-dev gcc2. 编译命令bash运行python3 setup.py build_ext --inplace3. 输出文件plaintextmyexample.cpython-310-x86_64-linux-gnu.so4. Python 调用python运行import myexample print(myexample.add(10, 20))5. 关键说明.so Linux 版.pyd代码完全不改原理、结构、调用方式 100% 相同五、嵌入式 Buildroot 交叉编译RK3588 / Hi3518重点在 PC 上编译 → 输出 ARM 架构 .so1. 确认交叉编译器来自 Buildroot示例路径按自己环境修改plaintext/home/your/buildroot/output/host/bin/aarch64-buildroot-linux-gnu-gcc2. 导出交叉编译环境变量bash运行export CCaarch64-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-compile4. 输出 ARM 格式 .soplaintextmyexample.cpython-311-aarch64-linux-gnu.so5. 放到开发板中调用python运行import myexample print(myexample.add(10, 20))6. 关键说明Buildroot 编译 Python 时自动生成Python.h 库交叉编译 PC 上生成 ARM 可执行文件嵌入式 Python import.so直接调用 C 语言_sqlite3.so、paho-mqtt、numpy 都是这样来的六、三者关系终极总结Windowsplaintext.py → import → .pydC 扩展 → .dllC 实现Linux PCplaintext.py → import → .soC 扩展 → .soC 实现嵌入式 Buildrootplaintext.py → import → ARM .soC 扩展 → ARM .soC 实现一句话原理C 代码全平台通用Windows 叫 .pydLinux 叫 .so都是 Python 与 C 语言之间的胶水层

更多文章