ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

IC验证必备技能——python/C API 基础教程

IC验证必备技能——python/C API 基础教程

以下教程面向完全不接触过 Python/C API 的小白,从环境准备到扩展模块、嵌入应用,逐步讲解常用函数和宏,并配以具体示例代码,帮助你快速上手。

环境准备

  1. 安装 Python 开发头文件
    在 Linux 上,一般需要安装对应版本的python3-dev(Debian/Ubuntu)或python3-devel(Fedora/CentOS)包,以提供<Python.h>等头文件和链接库。

  2. 编译命令示例

    gcc-O2-I/usr/include/python3.11\-oembed_app embed_app.c-lpython3.11

    其中-I指定头文件路径,-lpython3.11链接 Python 解释器库。


1. 初始化与终结

1.1Py_Initialize()/Py_FinalizeEx()

  • 在任何调用其他 C API 之前,必须先启动解释器:
    #include<Python.h>intmain(){Py_Initialize();// 启动 Python 解释器 ([Python documentation](https://docs.python.org/3/c-api/intro.html))/* ... 调用其它 API ... */Py_FinalizeEx();// 安全终结解释器 ([Python documentation](https://docs.python.org/3/c-api/intro.html))return0;}
  • 可选检查:if (!Py_IsInitialized())用于确认解释器状态 (Python documentation)。

2. 对象与引用计数

2.1PyObject *与Py_INCREF/Py_DECREF

  • 所有 Python 对象都以PyObject*表示,引用计数必须严格管理:
    PyObject*obj=PyLong_FromLong(10);// 新引用 ([Python documentation](https://docs.python.org/3/c-api/index.html))/* 使用 obj */Py_DECREF(obj);// 释放引用 ([Python documentation](https://docs.python.org/3/c-api/index.html))
  • Py_INCREF(o)用于增加引用,Py_DECREF(o)可能触发真正的释放。

2.2 借用引用 vs 新引用

  • 借用引用(Borrowed Reference):如PyList_GetItem()返回的对象,不应调用Py_DECREF(Python documentation)。
  • 新引用(New Reference):如PyLong_FromLong()、PyTuple_Pack()等返回的新对象,使用后必须Py_DECREF。

3. 基本类型与转换

3.1 从 C 到 Python

PyObject*py_int=PyLong_FromLong(42);// 整数 ([Python documentation](https://docs.python.org/3/c-api/index.html))PyObject*py_f
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进