新闻中心

C++怎么调用Python脚本_C++混合编程与Pybind11入门

2025-11-24
浏览次数:
返回列表
C++调用Python脚本可通过Python C API或Pybind11实现,后者更简洁安全。首先安装Pybind11,编写C++代码包含pybind11/embed.h和pybind11/eval.h头文件,使用py::scoped_interpreter启动解释器,通过py::exec执行Python代码,py::eval_file运行脚本,利用py::import导入模块并调用函数,自动处理类型转换与内存管理,结合CMake编译即可实现高效集成。

c++怎么调用python脚本_c++混合编程与pybind11入门

在C++项目中调用Python脚本,是实现高性能计算与灵活脚本处理结合的常见需求。比如你有一个用Python写的机器学习模型,但主程序是C++开发的,这时就需要让C++能“跑”起Python代码。实现方式主要有两种:直接使用Python C API,或者借助现代工具如Pybind11。后者更简洁、安全,也更适合现代C++开发。

使用Python C API直接调用Python脚本

这是最原始的方式,依赖Python官方提供的C接口。你需要在C++中嵌入Python解释器,然后执行.py文件或Python代码字符串。

步骤如下:

  • 安装Python开发库(如Ubuntu下安装python3-dev)
  • 包含头文件Python.h
  • 初始化Python解释器
  • 执行Python脚本或语句
  • 清理资源

示例代码:

#include <Python.h>
<p>int main() {
Py_Initialize();</p><pre class='brush:php;toolbar:false;'>// 执行一段Python代码
PyRun_SimpleString("print('Hello from Python!')");

// 运行一个Python脚本文件
FILE* fp = fopen("script.py", "r");
if (fp) {
    PyRun_SimpleFile(fp, "script.py");
    fclose(fp);
}

Py_Finalize();
return 0;

}

美图云修 美图云修

商业级AI影像处理工具

美图云修 50 查看详情 美图云修

编译命令示例:

g++ main.cpp -o main `python3-config --includes --libs`

注意:这种方式虽然直接,但代码冗长,容易出错,比如引用计数管理、异常处理等都需要手动处理。

使用Pybind11简化C++与Python交互

Pybind11是一个轻量级开源库,能让你用极简的C++代码将函数、类暴露给Python,也能反过来在C++中调用Python对象。它极大简化了混合编程的复杂度。

优势:

  • 语法接近Python,写起来像在写绑定
  • 自动处理类型转换、内存管理
  • 支持STL容器与Python对象互转(如vector ↔ list)

第一步:安装Pybind11

# Ubuntu/Debian sudo apt install libpybind11-dev

或通过pip安装(推荐用于开发)

pip install pybind11

第二步:编写C++调用Python的代码

#include <pybind11/embed.h>
#include <pybind11/eval.h>
namespace py = pybind11;
<p>int main() {
py::scoped_interpreter guard{}; // 启动Python解释器</p><pre class='brush:php;toolbar:false;'>// 直接执行Python表达式
py::exec(R"(
    import sys
    print("Hello from embedded Python")
    x = 42
)");

// 获取Python变量
py::object x = py::globals()["x"];
int value = x.cast<int>();
std::cout << "x = " << value << std::endl;

// 调用Python脚本文件
py::eval_file("script.py");

return 0;

}

第三步:编译(使用CMake推荐)

创建CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)
project(cpp_python_demo)
<p>set(CMAKE_CXX_STANDARD 17)</p><p>find_package(pybind11 REQUIRED)</p><p>add_executable(main main.cpp)
target_link_libraries(main pybind11::embed)</p>

然后:

mkdir build && cd build cmake .. && make

传递数据与调用函数

实际开发中,往往需要在C++和Python之间传递参数或调用具体函数。

示例:在C++中调用Python函数

# script.py def greet(name): return f"Hello, {name}!"

def add(a, b): return a + b

// C++中调用 py::object module = py::import_("script"); py::object result1 = module.attr("greet")("Alice"); py::object result2 = module.attr("add")(10, 20);

std::cout () ()

这样就能无缝调用Python函数,并获取返回值。

基本上就这些。Pybind11让C++调用Python变得直观又安全,比起原生API省心太多。只要注意环境配置和编译选项,很快就能集成进项目。

以上就是C++怎么调用Python脚本_C++混合编程与Pybind11入门的详细内容,更多请关注其它相关文章!


# 内存管理  # 印象不好的网站推广文案  # 江苏正规seo推广首页  # 北滘网站优化公司  # 音乐推广素材网站推荐  # 重庆做网站建设活动  # 无锡营销推广设计  # 驻马店企业网站推广  # 厦门搜索关键词排名产品  # 做seo要学会什么  # 品牌网站优化资费标准  # 你有  # 也能  # 主程序  # 太多  # 头文件  # python  # 这是  # 是一个  # 就能  # 美图  # r  # pip安装  # python脚本  # c++开发  # 环境配置  # python函数  # c++  # ai  # 工具  # ubuntu 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 12306选座系统怎么选连座_12306选座多人连坐操作方法  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法  CSS图片焦点样式实现教程:理解与应用tabindex属性  Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录  HTML空白字符处理机制:渲染、DOM与编码实践  顺丰快递查询系统 官方正版查询入口  QQ邮箱登录平台入口 QQ邮箱网页版邮箱官方入口  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  WordPress插件开发:正确注册卸载钩子与避免常见陷阱  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  虫虫漫画精品漫画官网_虫虫漫画精品漫画官网进入精品漫画  必由学网页版入口 必由学官方平台直接访问  漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接  夸克浏览器图书入口 夸克手机浏览器阅读入口  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  J*a递归快速排序中静态变量的状态管理与陷阱  中兴BladeV30怎样用测距估书架层高_iPhone中兴BladeV30测距估书架层高【家装参考】  Mac怎么查看崩溃日志_Mac控制台错误报告分析  葱吃多了会怎样 葱吃多了会伤胃吗  豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售  怎么在mac上运行html代码_mac运行html代码方法【指南】  Lar*el Excel导入时生成自定义递增ID的策略与实践  163邮箱登录密码 163邮箱忘记密码找回  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  微博网页版主页入口 微博官方网站免登录访问  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  解决Tabulator日期时间排序问题的专业指南  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  age动漫网站入口 age动漫官网直接访问入口  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  深入理解J*a链表中的IPosition接口与使用  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  将HTML Canvas内容转换为可上传的图像文件(File对象)  Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖  qq游戏跨平台入口_qq游戏多设备同步登录  抖音网页版平台入口 抖音网页版官网在线访问教程  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  QQ邮箱网页版入口 QQ邮箱官方邮箱登录通道  Win10系统服务哪些可以禁用 Win10安全优化服务列表【干货】  Django表单验证失败时保留用户输入数据的最佳实践  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口 

搜索