安装 C++与 Python 绑定工具

pip install pybind11

这其实相当于使用 python 安装了一个 c++的库 pybind11,这个库只由头文件构成, 支持基础数据类型传递以及 python 的 numpy 和 c++的 eigen 库之间的自动转换。

编写 CMakeList.txt

cmake_minimum_required(VERSION 3.14)
project(demo)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找 pybind11
set(pybind11_DIR "/home/erge/work/python/venv/demo/lib/python3.10/site-packages/pybind11/share/cmake/pybind11") # 这里是 pybind11 的安装路径,一般在虚拟环境的site-packages里面
find_package(pybind11 REQUIRED)
find_package(Eigen3 REQUIRED)
# 如果你使用的是系统安装的 pybind11,也可以使用:
# find_package(pybind11 REQUIRED MODULE)# 包含头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${pybind11_INCLUDE_DIRS})
include_directories(${EIGEN3_INCLUDE_DIR})# 添加模块
pybind11_add_module(demo main.cc)

编写c++代码

创建一个名为 main.cc 的源文件,并添加以下内容:

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>
#include <string>
#include <cmath>namespace py = pybind11;// 示例1: 简单函数
int add(int i, int j) {return i + j;
}// 示例2: 字符串操作函数
std::string greet(const std::string& name) {return "Hello, " + name + "!";
}// 示例3: C++ 类
class Calculator {
public:Calculator(double initial_value = 0.0) : value(initial_value) {}void add(double x) {value += x;}void multiply(double x) {value *= x;}double get_value() const {return value;}void set_value(double v) {value = v;}private:double value;
};// 示例4: 使用 STL 容器
std::vector<double> square_list(const std::vector<double>& input) {std::vector<double> result;result.reserve(input.size());for (const auto& item : input) {result.push_back(item * item);}return result;
}// 示例5: 数学计算函数
double calculate_distance(double x1, double y1, double x2, double y2) {double dx = x2 - x1;double dy = y2 - y1;return std::sqrt(dx * dx + dy * dy);
}// Python 绑定部分
PYBIND11_MODULE(demo, m) {m.doc() = "pybind11 示例模块"; // 模块文档字符串// 绑定简单函数m.def("add", &add, "两个整数相加",py::arg("i"), py::arg("j"));m.def("greet", &greet, "问候函数",py::arg("name") = "World");// 绑定数学函数m.def("calculate_distance", &calculate_distance, "计算两点间距离",py::arg("x1"), py::arg("y1"), py::arg("x2"), py::arg("y2"));// 绑定STL容器函数m.def("square_list", &square_list, "计算列表中每个元素的平方");// 绑定类py::class_<Calculator>(m, "Calculator").def(py::init<double>(), "构造函数", py::arg("initial_value") = 0.0).def("add", &Calculator::add, "加法操作", py::arg("x")).def("multiply", &Calculator::multiply, "乘法操作", py::arg("x")).def("get_value", &Calculator::get_value, "获取当前值").def("set_value", &Calculator::set_value, "设置当前值", py::arg("v")).def("__repr__", [](const Calculator& c) {return "<Calculator value=" + std::to_string(c.get_value()) + ">";});
}

python调用

使用上面的 CMakeLists.txt 和 main.cc 即可编译生成 demo.so 文件,接下来只要将这个 demo.so 文件添加到 python 的路径中,就可以在 python 中调用 C++ 函数了。

import sys
sys.path.append('/home/demo/build')  # 添加 .so 所在路径
import demo  # 引入 .so,调用 C++ 函数# 测试简单函数
print("=== 简单函数测试 ===")
result = demo.add(3, 4)
print(f"3 + 4 = {result}")greeting = demo.greet("Python")
print(greeting)# 测试数学函数
print("\n=== 数学函数测试 ===")
distance = demo.calculate_distance(0, 0, 3, 4)
print(f"点(0,0)到点(3,4)的距离: {distance}")# 测试STL容器
print("\n=== STL容器测试 ===")
numbers = [1.0, 2.0, 3.0, 4.0, 5.0]
squared = demo.square_list(numbers)
print(f"原列表: {numbers}")
print(f"平方后: {squared}")# 测试类
print("\n=== 类测试 ===")
calc = demo.Calculator(10.0)
print(f"初始值: {calc.get_value()}")calc.add(5)
print(f"加5后: {calc.get_value()}")calc.multiply(2)
print(f"乘2后: {calc.get_value()}")calc.set_value(100)
print(f"设置为100后: {calc.get_value()}")print(f"对象表示: {calc}")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917174.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917174.shtml
英文地址,请注明出处:http://en.pswp.cn/news/917174.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【OD机试题解法笔记】贪心歌手

题目描述 一个歌手准备从A城去B城参加演出。 按照合同&#xff0c;他必须在 T 天内赶到歌手途经 N 座城市歌手不能往回走每两座城市之间需要的天数都可以提前获知。歌手在每座城市都可以在路边卖唱赚钱。 经过调研&#xff0c;歌手提前获知了每座城市卖唱的收入预期&#xff1a…

AI: 告别过时信息, 用RAG和一份PDF 为LLM打造一个随需更新的“外脑”

嘿&#xff0c;各位技术同学&#xff01;今天&#xff0c;我们来聊一个大家在使用大语言模型&#xff08;LLM&#xff09;时都会遇到的痛点&#xff1a;知识过时。 无论是像我一样&#xff0c;用 Gemini Pro 学习日新月异的以太坊&#xff0c;还是希望它能精确掌握某个特定工具…

深度学习(鱼书)day08--误差反向传播(后三节)

深度学习&#xff08;鱼书&#xff09;day08–误差反向传播&#xff08;后三节&#xff09;一、激活函数层的实现 这里&#xff0c;我们把构成神经网络的层实现为一个类。先来实现激活函数的ReLU层和Sigmoid层。ReLU层 激活函数ReLU&#xff08;Rectified Linear Unit&#xff…

C# 中生成随机数的常用方法

1. 使用 Random 类&#xff08;简单场景&#xff09; 2. 使用 RandomNumberGenerator 类&#xff08;安全场景&#xff09; 3. 生成指定精度的随机小数 C# 中生成随机数的常用方法&#xff1a; 随机数类型实现方式示例代码特点与适用场景随机整数&#xff08;无范围&#xf…

Flink 算子链设计和源代码实现

1、JobGraph &#xff08;JobManager&#xff09; JobGraph 生成时&#xff0c;通过 ChainingStrategy 连接算子&#xff0c;最终在 Task 中生成 ChainedDriver 链表。StreamingJobGraphGeneratorcreateJobGraph() 构建jobGrapch 包含 JobVertex setChaining() 构建算子链isCha…

对接八大应用渠道

背景最近公司想把游戏包上到各个渠道上&#xff0c;因此需要对接各种渠道&#xff0c;渠道如下&#xff0c;oppo、vivo、华为、小米、应用宝、taptap、荣耀、三星等应用渠道 主要就是对接登录、支付接口&#xff08;后续不知道会不会有其他的&#xff09;&#x…

学习:入门uniapp Vue3组合式API版本(17)

42.打包发行微信小程序的上线全流程 域名 配置 发行 绑定手机号 上传 提交后等待&#xff0c;上传 43.打包H5并发布上线到unicloud的前端页面托管 完善配置 unicloud 手机号实名信息不一致&#xff1a;请确保手机号的实名信息与开发者姓名、身份证号一致&#xff0c;请前往开…

SOLIDWORKS材料明细表设置,属于自己的BOM表模板

上一期我们了解了如何在SOLIDWORKS工程图中添加材料明细表?接下来&#xff0c;我们将进行对SOLIDWORKS材料明细表的设置、查看缩略图、模板保存的深度讲解。01 材料明细表设置菜单栏生成表格后左侧菜单栏会显示关于材料明细表的相关设置信息。我们先了解一下菜单栏设置详情&am…

全栈:Maven的作用是什么?本地仓库,私服还有中央仓库的区别?Maven和pom.xml配置文件的关系是什么?

Maven和pom.xml配置文件的关系是什么&#xff1a; Maven是一个构建工具和依赖管理工具&#xff0c;而pom.xml&#xff08;Project Object Model&#xff09;是Maven的核心配置文件。 SSM 框架的项目不一定是 Maven 项目&#xff0c;但推荐使用 Maven进行管理。 SSM 框架的项目可…

超越 ChatGPT:智能体崛起,开启全自主 AI 时代

引言 短短三年,生成式 AI 已从对话助手跨越到能自主规划并完成任务的“智能体(Agentic AI)”时代。这场演进不仅体现在模型规模的提升,更在于系统架构、交互范式与安全治理的全面革新。本文按时间线梳理关键阶段与核心技术,为您呈现 AI 智能体革命的脉络与未来趋势。 1. …

一杯就够:让大脑瞬间在线、让肌肉满电的 “Kick-out Drink” 全解析

一杯就够&#xff1a;让大脑瞬间在线、让肌肉满电的 “Kick-out Drink” 全解析“每天清晨&#xff0c;当闹钟还在哀嚎&#xff0c;你举杯一饮&#xff0c;睡意像被扔出擂台——这&#xff0c;就是 Kick-out Drink 的全部浪漫。”清晨 30 分钟后&#xff0c;250 mL 常温水里溶解…

系统开机时自动执行指令

使用 systemd 创建一个服务单元可以让系统开机时自动执行指令&#xff0c;假设需要执行的指令如下&#xff0c;运行可执行文件&#xff08;/home/demo/可执行文件&#xff09;&#xff0c;并输入参数&#xff08;–input/home/config/demo.yaml&#xff09;&#xff1a; /home/…

Docker 初学者需要了解的几个知识点 (七):php.ini

这段配置是 php.ini 文件中针对 PHP 扩展和 Xdebug 调试工具的设置&#xff0c;主要用于让 PHP 支持数据库连接和代码调试&#xff08;尤其在 Docker 环境中&#xff09;&#xff0c;具体解释如下&#xff1a;[PHP] extensionpdo_mysql extensionmysqli xdebug.modedebug xdebu…

【高阶版】R语言空间分析、模拟预测与可视化高级应用

随着地理信息系统&#xff08;GIS&#xff09;和大尺度研究的发展&#xff0c;空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用&#xff0c;其中在空间分析方面扮演着重要角色&#xff0c;与空间相关的包的数量也达到130多个。在本…

dolphinscheduler中一个脚本用于从列定义中提取列名列表

dolphinscheduler中&#xff0c;我们从一个mysql表导出数据&#xff0c;上传到hdfs, 再创建一个临时表&#xff0c;所以需要用到列名定义和列名列表。 原来定义两个变量&#xff0c;不仅繁锁&#xff0c;还容易出现差错&#xff0c;比如两者列序不对。 所以考虑只定义列定义变量…

JavaWeb(苍穹外卖)--学习笔记16(定时任务工具Spring Task,Cron表达式)

前言 本篇文章是学习B站黑马程序员苍穹外卖的学习笔记&#x1f4d1;。我的学习路线是Java基础语法-JavaWeb-做项目&#xff0c;管理端的功能学习完之后&#xff0c;就进入到了用户端微信小程序的开发&#xff0c;用户端开发的流程大致为用户登录—商品浏览&#xff08;其中涉及…

灵敏度,精度,精确度,精密度,精准度,准确度,分辨率,分辨力——概念

文章目录前提总结前提 我最近在整理一份数据指标要求的时候&#xff0c;总是混淆这几个概念&#xff1a;灵敏度&#xff0c;精度&#xff0c;精确度&#xff0c;精密度&#xff0c;精准度&#xff0c;准确度&#xff0c;分辨率&#xff0c;分辨力&#xff0c;搜了一些文章&…

python-异常(笔记)

#后续代码可以正常运行 try:f open("xxx.txt","r",encodingutf-8)except:print("except error")#捕获指定异常&#xff0c;其他异常报错程序中止&#xff0c;管不到 try:print(name) except NameError as you_call:print("name error"…

[lvgl_player] 用户界面(LVGL) | 播放器核心设计

docs&#xff1a;基于LVGL的音乐播放器 本项目是为嵌入式设备设计的音乐播放系统&#xff0c;采用LVGL图形库构建用户界面。 系统支持播放WAV格式音频文件&#xff0c;具备播放列表管理功能&#xff0c;可实现播放/暂停控制、曲目切换等核心操作。 用户可通过交互界面实时调…

数据赋能(354)——数据分析——多角度分析原则

概述重要性如下&#xff1a;获得全面理解&#xff1a;多角度分析原则避免仅从单一角度解读数据&#xff0c;从不同角度、不同维度对数据进行分析&#xff0c;以获得更全面的理解。发现潜在规律&#xff1a;通过多角度分析&#xff0c;发现数据中的潜在规律和趋势&#xff0c;为…