使用Python和Pybind11调用C++程序(CMake编译)
目录
- 一、前言
- 二、安装 pybind11
- 三、编写C++示例代码
- 四、结合Pybind11和CMake编译C++工程
- 五、Python调用动态库
- 六、参考

一、前言
跨语言调用能对不同计算机语言进行互补,本博客主要介绍如何实现Python调用C++语言编写的函数。
实验环境:
- Linux gnu
- Python==3.10
- CMake
- C++11
首先,使用官网提供的说明对pybind11进行基本的介绍,具体内容如下:
pybind11 是一个轻量级的头文件库,用于在 Python 和 C++ 之间互相暴露类型,主要用于为现有的 C++ 代码创建 Python 绑定。它的目标和语法类似于 David Abrahams 开发的出色 Boost.Python 库:通过使用编译时内省来推断类型信息,最小化传统扩展模块中的样板代码。
Boost.Python 的主要问题在于其所属的 Boost 套件。Boost 是一个巨大的、复杂的实用程序库集合,几乎可以与所有现存的 C++ 编译器一起工作。这种兼容性是有代价的:为了支持最古老和最有问题的编译器样本,必须使用神秘的模板技巧和变通方法。现在,由于广泛可用的兼容 C++11 的编译器,这种重型机制已经变成了一个过大且不必要的依赖项。
将这个库视为 Boost.Python 的一个微型自包含版本,其中剥离了与绑定生成无关的所有内容。没有注释的核心头文件只需约 4K 行代码,并依赖于 Python(3.7+ 或 PyPy)和 C++ 标准库。这种紧凑的实现得益于一些 C++11 语言特性(特别是:元组、lambda 函数和可变参数模板)。自从该库创建以来,它在许多方面已经超越了 Boost.Python,导致在许多常见情况下绑定代码大大简化。
本博客主要介绍现在主流的Pybind11实现Python调用C++程序。
二、安装 pybind11
克隆pybind11工程项目文件,在终端输入命令如下:
git clone https://github.com/pybind/pybind11.git
安装依赖包pytest,用于pybind11示例测试,在终端输入命令如下:
pip install pytest
编译pybind11并进行安装,依次输入命令如下:
cd pybind11
mkdir build
cd build
cmake ..
cmake --build . --config Release --target check -j4
make install
三、编写C++示例代码
编写一个C++示例代码,用于进行简单的除法计算。后续使用python语言进行调用,C++示例代码具体内容如下:
说明:需要在原来编写的C++代码(文件名称为test_strategy.cpp)上增加<pybind11/pybind11.h>和<pybind11/stl.h>两个库,同时要多定义一个空间变量namespace py = pybind11,最后需要进行pybind11模块的实例化,即用”test“属性调用test函数。
#include <iostream>
#include <stddef.h>
#include <stdio.h> // This ert_main.c example uses printf/fflush
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
namespace py = pybind11;
using namespace std;float test(float a, float b);
float test(float a, float b)
{ return a / b;
}// instantiation
PYBIND11_MODULE(test_strategy, m) {m.def("test", &test);
}
四、结合Pybind11和CMake编译C++工程
在准备好C++代码后,接下来就需要编写CMakeLists.txt文件,引导CMake编译上一节的C++工程,具体内容如下:
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)# 项目信息 项目名称和使用的C++标准
project (test_strategy)
set(CMAKE_CXX_FLAGS "-std=c++11")# 执行文件输出路径,这里需要改成调用该函数的python环境
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
set(PYTHON EXECUTABLE "~/anaconda3/bin/python")# 头文件和源文件保存路径
#set(INCLUDE_DIR ./include)
set(SRC_DIR ../)
find_package(pybind11 REQUIRED)
include_directories(${pybind11_INCLUDE_DIRS})# 链接python的库文件
link_directories(~/anaconda3/lib) # 将python头文件包含进来
INCLUDE_DIRECTORIES(~/anaconda3/include/python3.10)# 链接到python动态库文件
link_libraries(~/anaconda3/pkgs/python-3.10.9-h89984f6_1/lib/libpython3.10.so)#include_directories(${INCLUDE_DIR})
file(GLOB_RECURSE SOURCES "${SRC_DIR}/test_strategy.cpp")Pybind11_add_module(${PROJECT_NAME} ${SRC_DIR}/test_strategy.cpp ${SOURCES})
然后,在终端中依次输入如下命令进行CMake编译:
mkdir build
cd build
cmake ..
make
cp ../test_strategy.cpython-310-arrach64-linux-gnu.so
最后,得到该python环境下对应的动态库文件,具体文件名如下所示:

五、Python调用动态库
编写一个python脚本文件调用test_strategy动态库,具体内容如下所示:
from test_strategy import test
res = test(1, 2)
print("1 / 2 =", res)
运行上述代码对应的py脚本,测试结果输出如下所示:

六、参考
[1] https://pybind11.readthedocs.io/en/stable/index.html
[2] https://www.cnblogs.com/lidabo/p/16625524.html
相关文章:
使用Python和Pybind11调用C++程序(CMake编译)
目录 一、前言二、安装 pybind11三、编写C示例代码四、结合Pybind11和CMake编译C工程五、Python调用动态库六、参考 一、前言 跨语言调用能对不同计算机语言进行互补,本博客主要介绍如何实现Python调用C语言编写的函数。 实验环境: Linux gnuPython3.10…...
tableau-制作30个图表
制作条形图 步骤: 1、横轴是数值,对应了某一个度量值,纵轴是一个标签 战区的成交额,条形图横轴是战区,纵轴是成交额 下钻条形图 1、增加业务架构-战区右键点击,分层结构,增加分层结构 调整业务架构,将战区,城市,小组移动到业务架构下方 此时的条形图上方有➕号展开后…...
2024APMCM亚太杯数学建模C题【宠物行业】原创论文分享
大家好呀,从发布赛题一直到现在,总算完成了2024 年APMCM亚太地区大学生数学建模竞赛C题的成品论文。 给大家看一下目录吧: 目录 摘 要: 10 一、问题重述 14 二.问题分析 15 2.1问题一 15 2.2问题二 15 2.3问题三…...
C语言解析命令行参数
原文地址:C语言解析命令行参数 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 C语言有一个 getopt 函数,可以对命令行进行解析,下面给出一个示例,用的时候可以直接copy过去修改,很方便…...
推荐一款龙迅HDMI2.0转LVDS芯片 LT6211UX LT6211UXC
龙迅的HDMI2.0转LVDS芯片LT6211UX和LT6211UXC是两款高性能的转换器芯片,它们在功能和应用上有所差异,同时也存在一些共同点。以下是对这两款芯片的详细比较和分析: 一、LT6211UX 主要特性: HDMI2.0至LVDS和MIPI转换器。HDMI2.0输…...
libmodbus 源码学习笔记
1.核心函数_框架_数据结构 整个通信的过程 就是上面这个框架 下面就是具体过程 <1> 主设备 我们首先要初始化 我们要使用的串口 然后 设置我们要访问的哪一个设备 最后打开串口 <2>从机设备 也是我们要初始化我们的串口 然后随后立即设置我们的串口设备地址 最后…...
通用网络安全设备之【防火墙】
概念: 防火墙(Firewall),也称防护墙,它是一种位于内部网络与外部网络之间的网络安全防护系统,是一种隔离技术,允许或是限制传输的数据通过。 基于 TCP/IP 协议,主要分为主机型防火…...
Vue.js基础——贼简单易懂!!(响应式 ref 和 reactive、v-on、v-show 和 v-if、v-for、v-bind)
Vue.js是一个渐进式JavaScript框架,用于构建用户界面。它专门设计用于Web应用程序,并专注于视图层。Vue允许开发人员创建可重用的组件,并轻松管理状态和数据绑定。它还提供了一个虚拟DOM系统,用于高效地渲染和重新渲染组件。Vue以…...
Mybatis 执行存储过程,获取输出参数的值
数据库环境:SQL Server 2008 R2 存储过程 alter procedure proc_generateOuterApplyId acceptType varchar(4),acceptGroupId int,outerApplyId varchar(20) output as begin set nocount onset outerApplyId 24GD6688--select outerApplyId as …...
RAG架构类型
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
Oracle 数据库 IDENTITY 列的性能选项
在上一篇文章Oracle 数据库 IDENTITY 列中,我们介绍了Oracle IDENTITY列的基础知识。本文将介绍IDENTITY列的几个性能选项。由于IDENTITY列内部使用sequence机制,因此也等同于是sequence的性能选项。 由于sequence是递增的,在高并发时&#…...
计算(a+b)/c的值
计算(ab)/c的值 C语言代码C语言代码Java语言代码Python语言代码 💐The Begin💐点点关注,收藏不迷路💐 给定3个整数a、b、c,计算表达式(ab)/c的值,/是整除运算。 输入 输入仅一行&…...
OpenCV从入门到精通实战(八)——基于dlib的人脸关键点定位
本文使用Python库dlib和OpenCV来实现面部特征点的检测和标注。 下面是代码的主要步骤和相关的代码片段: 步骤一:导入必要的库和设置参数 首先,代码导入了必要的Python库,并通过argparse设置了输入图像和面部标记预测器的参数。…...
unity | 动画模块之卡片堆叠切换
一、预览动画 可以放很多图,可以自己往后加,可以调图片x轴和y轴间距,可以调图片飞出方向,可以调堆叠方向。 图1 图片堆叠动画预览 二、纯净代码 有粉丝问我这个效果,最近很忙,没有时间细写,先…...
前端开发工程师需要学什么?
前端开发工程师需要学习的主要内容包括HTML、CSS、JavaScript、前端框架、响应式设计、性能优化、版本控制等。 HTML/CSS/JavaScript HTML:是网页的骨架,负责网页的结构和内容。CSS:用于美化网页,设计样式和布局。…...
网络常见命令
一.添加ip地址 (1)先进入端口号 interface 端口号 (2)添加ip地址 IP address xxx.xxx.x.x 主机位 二、查看路由表(查看192.168.3.1) display ip routing-table 192.168.3.1 三、宣告(宣告完后…...
logminer挖掘日志归档查找问题
--根据发生问题时间点查找归档文件 select first_time,NAME from gv$archived_log where first_time>2016-03-15 17:00:00 and first_time<2016-03-15 21:00:00; 2016-03-15 17:23:55 ARCH/jxdb/archivelog/2016_03_15/thread_1_seq_41588.4060.906577337 2016-03-15 17:…...
Flume和kafka的整合:使用Flume将日志数据抽取到Kafka中
文章目录 1、Kafka作为Source【数据进入到kafka中,抽取出来】2、kafka作为Sink 【数据从别的地方抽取到kafka里面】 1、Kafka作为Source【数据进入到kafka中,抽取出来】 kafka源 --> memory --> 控制台: a1.sources r1 a1.sinks k1…...
springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)
引言: 该类博客的学习是基于b站黑马视频springbootvue视频学习!具体围绕项目——"大事件"进行实战学习。 目录 一、功能介绍(需求)。 1、文章列表功能基本介绍。 2、条件分页查询功能与注意。 3、前端页面效果。&#x…...
ScreenshotToCode安装教程
网页截图生成代码,我测试的效果一般 快速安装教程如下 1,首先你得有OpenAI的账号 国内用这个代理就可以: https://www.closeai-asia.com/ 充值一块钱,在本项目中可以生成两次 2,下载程序 下载程序压缩包࿱…...
Translumo完整指南:高效实时屏幕翻译工具解决你的多语言障碍难题
Translumo完整指南:高效实时屏幕翻译工具解决你的多语言障碍难题 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo …...
CosyVoice Docker 部署优化:如何有效降低 CPU 占用率
在语音合成服务日益普及的今天,CosyVoice 凭借其出色的音质和灵活性,成为了许多开发者的选择。然而,当我们将它部署到 Docker 容器中时,一个普遍且棘手的问题随之而来:CPU 占用率居高不下。这不仅导致服务器资源成本飙…...
自学C#的第三天
今天自学了c#,并看了相关的unity课程视频,加油,争取找到一份好的实习,简历投递效果不是很成功,打算给我的qt项目重新完善一下...
【BoClaw教程03】BoClaw实战:打工人常用技能
博云BoClaw官方教程系列(三)本教程聚焦打工人日常办公高频需求,详细讲解 BoClaw 在桌面整理、文档检索、PPT 制作、简历筛选、销售报表处理五大场景的实操方法、操作要点及避坑技巧,助力高效提升办公效率。1.桌面整理:…...
基于YOLOv10深度学习的管道泄漏检测系统(YOLOv10+YOLO数据集+UI界面+Python项目+模型)
一、项目介绍 项目摘要 随着工业管道运输系统的日益复杂化,管道泄漏事故不仅会造成巨大的经济损失,还可能引发严重的环境污染和安全事故。为了实现对管道泄漏的快速、准确识别,本研究提出了一种基于YOLOv10深度学习模型的智能管道泄漏检测系…...
熵值法实战避坑指南:从数据标准化到权重计算,新手最容易踩的3个雷
熵值法实战避坑指南:从数据标准化到权重计算,新手最容易踩的3个雷 第一次用熵值法做综合评价时,我盯着屏幕上几乎相同的权重值发愣——这和教科书上"差异越大权重越高"的描述完全不符。直到深夜排查才发现,原来在数据标…...
解锁毕业论文新姿势:书匠策AI,你的学术“超级外挂”!
在学术的征途上,毕业论文无疑是每位学子必须跨越的一道重要关卡。它不仅是对你大学四年学习成果的全面检验,更是你迈向学术殿堂或职场的重要敲门砖。然而,面对堆积如山的资料、错综复杂的逻辑结构,以及那令人头疼的格式要求&#…...
5G赋能下的车联网协同感知:自动驾驶感知盲区消除新思路
1. 为什么自动驾驶需要"组队开黑"模式? 想象一下你开车经过一个十字路口,左侧突然冲出一辆外卖电动车——这是典型的A柱盲区问题。传统自动驾驶就像闭着眼睛打游戏,全靠本车传感器"听声辨位"。而5G车联网协同感知&#x…...
【板栗糖GIS】从KML到KMZ:GIS数据压缩、共享与ArcMap实战指南
1. KMZ与KML:GIS数据压缩与共享的黄金拍档 第一次接触KMZ文件时,我也被这个后缀名搞得一头雾水。直到有次野外测绘,队友发来一个带照片的谷歌地图范围文件,才真正体会到它的便利性。简单来说,KMZ就是KML的压缩版本&…...
免费解锁付费内容:Bypass Paywalls Clean Chrome扩展终极指南
免费解锁付费内容:Bypass Paywalls Clean Chrome扩展终极指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字阅读时代,你是否经常遇到想阅读的文章被付…...
