新闻中心
C++怎么调用Python脚本_C++混合编程与Pybind11入门
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脚本,是实现高性能计算与灵活脚本处理结合的常见需求。比如你有一个用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邮箱网页入口


2025-11-24
浏览次数:次
返回列表
.py", "r");
if (fp) {
PyRun_SimpleFile(fp, "script.py");
fclose(fp);
}
Py_Finalize();
return 0;