C++_python_相互之间的包含调用方法

1、C++的代码封装成插件或者封装成库,供python调用

C++ 代码完全可以封装成插件或库,供 Python 调用。这是 Python 生态中非常常见且成熟的做法,尤其在需要高性能计算、调用底层系统功能或复用已有 C/C++ 代码时。
以下是几种主流方法:

✅ 方法一:使用 pybind11(最推荐)

pybind11 是一个轻量级、现代的 C++ 库,专为将 C++ 代码暴露给 Python 而设计。语法简洁,支持 C++11 及以上特性(如类、重载、STL 容器等)。
示例步骤:

编写 C++ 代码(example.cpp): 
#include <pybind11/pybind11.h> int add(int a, int b){return a + b;} PYBIND11_MODULE(example, m){ m.doc()="pybind11 example plugin"; m.def("add", &add, "A function that adds two numbers");}

编译为 Python 模块(使用 setup.py):

# setup.py from setuptools import setup, Extension from pybind11.setup_helpers import Pybind11Extension, build_ext ext_modules =[ Pybind11Extension("example", # 模块名["example.cpp"], # 源文件), ] setup(name="example", ext_modules=ext_modules, cmdclass={"build_ext": build_ext}, zip_safe=False, )

构建并安装:

 pip install pybind11 python setup.py build_ext --inplace 

在 Python 中调用:

import example print(example.add(2, 3))# 输出 5
✅ 优点:开发简单、性能高、自动类型转换、支持复杂 C++ 特性 🔧 依赖:需安装 pybind11(pip install pybind11) 

✅ 方法二:使用 Python C API(官方底层接口)

直接使用 Python 提供的 C API 编写扩展模块(.so 或 .pyd)。这是最底层的方式,但代码繁琐。
示例(简化):

// example.c #include <Python.h> static PyObject* add(PyObject* self, PyObject* args){ int a, b;if(!PyArg_ParseTuple(args, "ii", &a, &b))return NULL;return PyLong_FromLong(a + b);} static PyMethodDef methods[]={{"add", add, METH_VARARGS, "Add two integers"}, {NULL, NULL, 0, NULL}}; static struct PyModuleDef module ={ PyModuleDef_HEAD_INIT, "example", NULL, -1, methods }; PyMODINIT_FUNC PyInit_example(void){return PyModule_Create(&module);}

然后用 setup.py 编译(类似上面,但不用 pybind11)。
✅ 优点:不依赖第三方库
❌ 缺点:代码冗长、易出错、需手动管理引用计数

✅ 方法三:使用 Cython

Cython 是 Python 的超集,可将 .pyx 文件编译为 C 扩展。你可以在 Cython 中调用 C/C++ 代码,并暴露给 Python。
适合场景:已有 C++ 代码,想通过中间层包装。

✅ 优点:与 NumPy 集成好,适合数值计算 ⚠️ 注意:需学习 Cython 语法 

✅ 方法四:封装为 动态链接库 + ctypes / cffi

如果你不想生成 Python 扩展模块,也可以:

将 C++ 函数用 extern "C" 导出为 C 接口(避免 C++ 名称修饰) 编译为 .so(Linux/macOS)或 .dll(Windows) 在 Python 中用 ctypes 或 cffi 加载调用 

示例(C++ 端):

// mathlib.cpp extern "C"{ int add(int a, int b){return a + b;}}

编译:

g++ -shared -fPIC -o mathlib.so mathlib.cpp 

Python 调用:

import ctypes lib = ctypes.CDLL("./mathlib.so") lib.add.argtypes =(ctypes.c_int, ctypes.c_int) lib.add.restype = ctypes.c_int print(lib.add(2, 3))# 5
✅ 优点:无需 Python 扩展构建系统,跨语言通用 ❌ 缺点:只能导出 C 风格接口,不支持类、异常、STL 等 C++ 特性 

五、 📌 总结对比

表格

方法易用性性能支持 C++ 特性适用场景
pybind11⭐⭐⭐⭐⭐完全支持(类、模板、STL)首选方案
Python C API⭐⭐需手动封装底层开发/无第三方依赖
Cython⭐⭐⭐有限支持数值计算、与 NumPy 集成
ctypes/cffi⭐⭐⭐仅 C 接口快速调用简单函数

💡 建议

新项目 → 优先用 pybind11 已有 C 函数库 → 用 ctypes 快速集成 高性能数值计算 → 考虑 Cython 嵌入式/受限环境 → 用原生 C API 

2、python的代码封装成插件或者封装成库,供C++调用

Python 代码可以封装成库或插件供 C++ 调用,但通常需要借助一些特定的技术或工具。以下是几种主流方法:

方法一:使用 Python/C API(官方接口)

这是 Python 官方提供的 C 接口,C++ 可以通过它嵌入 Python 解释器并调用 Python 代码。
步骤简述:

在 C++ 项目中链接 Python 的动态库(如 libpython3.x.so 或 python3x.lib)。 使用 Py_Initialize() 初始化解释器。 用 PyRun_SimpleString() 或 PyObject_CallObject() 等函数加载并调用 Python 模块/函数。 处理 Python 对象与 C++ 数据类型的转换。 最后调用 Py_Finalize() 清理。 

示例(简化):

#include <Python.h> int main(){ Py_Initialize(); PyRun_SimpleString("import sys; sys.path.append('.')"); PyRun_SimpleString("import mymodule"); PyRun_SimpleString("mymodule.my_function()"); Py_Finalize();return0;}
✅ 优点:直接、灵活 ❌ 缺点:需手动管理引用计数、错误处理复杂、依赖 Python 环境 

方法二:使用 pybind11(推荐)

虽然 pybind11 主要用于将 C++ 暴露给 Python,但它也支持反向操作——在 C++ 中嵌入 Python。
不过更常见的是:将核心逻辑写成 C++,用 pybind11 暴露给 Python;如果已有 Python 代码想被 C++ 调用,仍建议用 Python/C API 或生成可执行接口。
但 pybind11 本身不直接“让 C++ 调用任意 Python 函数”变得简单,它更擅长反向绑定。

方法三:将 Python 封装为 独立服务(进程间通信)

如果不想在 C++ 中嵌入 Python 解释器,可以把 Python 代码做成一个独立的服务(如 HTTP API、gRPC、ZeroMQ、共享内存、管道等),C++ 通过 IPC 调用。
例如:

Python 启动一个 Flask/FastAPI 服务 C++ 用 libcurl 发送 HTTP 请求调用该服务 ✅ 优点:解耦、跨语言、稳定 ❌ 缺点:有网络开销、部署复杂度略高 

方法四:将 Python 编译为 共享库(较难)

有一些工具尝试将 Python 编译成原生二进制(如 Cython、Nuitka、Shiv、PyOxidizer),但:

Nuitka 可以将 Python 编译成 C++ 扩展模块(.so / .dll),但这些模块仍是供 Python 调用的,不是直接供 C++ 调用。 目前没有成熟方案能将任意 Python 代码直接编译成标准 C++ 可链接的 .so 库(像 C 函数那样被 extern "C" 调用)。 

所以这条路通常不可行,除非你用 Cython 重写部分代码为 .pyx 并导出 C 接口。
实用建议:

场景推荐方案
C++ 需频繁调用少量 Python 脚本使用 Python/C API 嵌入解释器
Python 逻辑复杂、需长期运行将 Python 做成 微服务,C++ 通过网络调用
性能敏感、低延迟重写关键部分为 C++,用 pybind11 让 Python 调用 C++(反向)
不想依赖 Python 运行时考虑用 Cython 重写并导出 C 接口

补充:构建注意事项

C++ 项目需链接 Python 开发库(如 Ubuntu 上 sudo apt install python3-dev) 注意 Python 版本匹配(3.8/3.9/3.10...) 多线程环境下需注意 GIL(全局解释器锁) 

Read more

Flutter for OpenHarmony: Flutter 三方库 openid_client 深度打通鸿蒙应用的单点登录 (SSO)(基于 OpenID Connect 标准)

Flutter for OpenHarmony: Flutter 三方库 openid_client 深度打通鸿蒙应用的单点登录 (SSO)(基于 OpenID Connect 标准)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在现代企业级 OpenHarmony 应用中,为了安全和便捷,往往会使用 OpenID Connect (OIDC) 协议进行统一身份认证。无论是集成 Google 登录、GitHub 登录,还是对接企业内部的 Keycloak、Okta 等身份提供商(IdP),我们都需要一个健壮的库来处理繁杂的 OAuth2 握手流程。 openid_client 是一个功能极其全面的 Dart 实现。它能够自动发现服务器端点(Discovery)、处理 PKCE 流程并安全地交换令牌,是构建高安全级别鸿蒙应用的首选。 一、核心认证流程 OIDC 认证流程通常是通过浏览器重定向完成的,openid_client 充当了流程的指挥官。 身份服务器 (IdP)openid_client鸿蒙

By Ne0inhk
本地部署 Stable Diffusion:零基础搭建 AI文生图模型

本地部署 Stable Diffusion:零基础搭建 AI文生图模型

本地部署 Stable Diffusion:零基础搭建 AI 文生图系统 Stable Diffusion 是一款强大的开源文生图(Text-to-Image)AI 模型,可以本地运行,无需联网或付费就能生成高质量图像。相比 Midjourney、DALL·E 等云服务,Stable Diffusion 更自由、更可控。 这篇文章将手把手教你如何使用 Stable Diffusion WebUI(AUTOMATIC1111) 在本地搭建一个高效、可定制的 AI 画图系统,适合 AI 爱好者、程序员和设计师。 ✅ 目录 1. 为什么选择 Stable Diffusion? 2. 环境准备:硬件 & 软件 3. 安装与部署 WebUI 4.

By Ne0inhk

WhisperLiveKit 会议纪要模板定制:适配不同场景的纪要样式

核心定制原则 * 场景分类:区分正式会议、头脑风暴、项目复盘等场景,匹配对应的结构化模板。 * 关键元素保留:时间、参与人、决议事项、待办任务为通用必选项,其他字段按需增减。 正式会议模板示例 标题格式:[类型]项目名_日期(如[决策]Q3预算会_20240520) 内容结构: * 背景说明(3行以内) * 决议事项(编号列表,含责任人与DDL) * 争议点记录(斜体标注未达成共识项) * 附件链接(直接粘贴WhisperLiveKit生成的会议录音/转录URL) 创意讨论模板示例 标题格式:[脑暴]主题_发起人 内容结构: * 灵感池(无序列表记录所有点子) * 投票结果(用✅×3形式标记票数) * 可行性筛选(分立即执行/长期储备两栏表格) 技术评审模板示例 标题格式:[评审]系统名_

By Ne0inhk

一键部署Z-Image-Turbo:云端AI绘画不求人

一键部署Z-Image-Turbo:云端AI绘画不求人 你是不是也遇到过这样的场景:脑子里有个绝妙的画面,想把它画出来,但要么不会画画,要么打开专业绘图软件折腾半天,最后出来的效果还不如想象力的十分之一? 或者,作为内容创作者、电商运营,每天需要大量配图、海报,找图库要花钱,自己设计又太费时间,效率低得让人抓狂。 今天,我要给你介绍一个“神器”——Z-Image-Turbo 极速云端创作室。它不是一个复杂的软件,而是一个打包好的云端AI绘画应用。你不需要懂代码,不需要配置环境,甚至不需要高性能电脑,只需要点几下鼠标,就能拥有一个属于你自己的、能秒级生成高清大图的AI画室。 这听起来是不是有点不可思议?别急,跟着我,10分钟你就能亲手把它搭建起来,并画出第一张作品。 1. 为什么你需要这个“云端画室”? 在深入动手之前,我们先搞清楚,这个工具到底能帮你解决什么问题。 1.1 传统AI绘画的三大痛点 如果你之前尝试过一些AI绘画工具,可能会对这几个问题深有体会: 1. 部署复杂:想用开源的Stable Diffusion?光是安装Python、

By Ne0inhk