全程实战代码 + 逐行注解,不讲废话,直接可用

统一说明

  1. Windows 输出:.pyd
  2. Linux PC / 服务器 输出:.so
  3. 嵌入式 Buildroot(RK3588/Hi3518) 输出:ARM 架构 .so
  4. 三者 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 语言之间的胶水层

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐