当前位置: 首页 > news >正文

使用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调用动态库六、参考 一、前言 跨语言调用能对不同计算机语言进行互补&#xff0c;本博客主要介绍如何实现Python调用C语言编写的函数。 实验环境&#xff1a; Linux gnuPython3.10…...

tableau-制作30个图表

制作条形图 步骤: 1、横轴是数值,对应了某一个度量值,纵轴是一个标签 战区的成交额,条形图横轴是战区,纵轴是成交额 下钻条形图 1、增加业务架构-战区右键点击,分层结构,增加分层结构 调整业务架构,将战区,城市,小组移动到业务架构下方 此时的条形图上方有➕号展开后…...

2024APMCM亚太杯数学建模C题【宠物行业】原创论文分享

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024 年APMCM亚太地区大学生数学建模竞赛C题的成品论文。 给大家看一下目录吧&#xff1a; 目录 摘 要&#xff1a; 10 一、问题重述 14 二&#xff0e;问题分析 15 2.1问题一 15 2.2问题二 15 2.3问题三…...

C语言解析命令行参数

原文地址&#xff1a;C语言解析命令行参数 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 C语言有一个 getopt 函数&#xff0c;可以对命令行进行解析&#xff0c;下面给出一个示例&#xff0c;用的时候可以直接copy过去修改&#xff0c;很方便…...

推荐一款龙迅HDMI2.0转LVDS芯片 LT6211UX LT6211UXC

龙迅的HDMI2.0转LVDS芯片LT6211UX和LT6211UXC是两款高性能的转换器芯片&#xff0c;它们在功能和应用上有所差异&#xff0c;同时也存在一些共同点。以下是对这两款芯片的详细比较和分析&#xff1a; 一、LT6211UX 主要特性&#xff1a; HDMI2.0至LVDS和MIPI转换器。HDMI2.0输…...

libmodbus 源码学习笔记

1.核心函数_框架_数据结构 整个通信的过程 就是上面这个框架 下面就是具体过程 <1> 主设备 我们首先要初始化 我们要使用的串口 然后 设置我们要访问的哪一个设备 最后打开串口 <2>从机设备 也是我们要初始化我们的串口 然后随后立即设置我们的串口设备地址 最后…...

通用网络安全设备之【防火墙】

概念&#xff1a; 防火墙&#xff08;Firewall&#xff09;&#xff0c;也称防护墙&#xff0c;它是一种位于内部网络与外部网络之间的网络安全防护系统&#xff0c;是一种隔离技术&#xff0c;允许或是限制传输的数据通过。 基于 TCP/IP 协议&#xff0c;主要分为主机型防火…...

Vue.js基础——贼简单易懂!!(响应式 ref 和 reactive、v-on、v-show 和 v-if、v-for、v-bind)

Vue.js是一个渐进式JavaScript框架&#xff0c;用于构建用户界面。它专门设计用于Web应用程序&#xff0c;并专注于视图层。Vue允许开发人员创建可重用的组件&#xff0c;并轻松管理状态和数据绑定。它还提供了一个虚拟DOM系统&#xff0c;用于高效地渲染和重新渲染组件。Vue以…...

Mybatis 执行存储过程,获取输出参数的值

数据库环境&#xff1a;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热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Oracle 数据库 IDENTITY 列的性能选项

在上一篇文章Oracle 数据库 IDENTITY 列中&#xff0c;我们介绍了Oracle IDENTITY列的基础知识。本文将介绍IDENTITY列的几个性能选项。由于IDENTITY列内部使用sequence机制&#xff0c;因此也等同于是sequence的性能选项。 由于sequence是递增的&#xff0c;在高并发时&#…...

计算(a+b)/c的值

计算&#xff08;ab&#xff09;/c的值 C语言代码C语言代码Java语言代码Python语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 给定3个整数a、b、c&#xff0c;计算表达式(ab)/c的值&#xff0c;/是整除运算。 输入 输入仅一行&…...

OpenCV从入门到精通实战(八)——基于dlib的人脸关键点定位

本文使用Python库dlib和OpenCV来实现面部特征点的检测和标注。 下面是代码的主要步骤和相关的代码片段&#xff1a; 步骤一&#xff1a;导入必要的库和设置参数 首先&#xff0c;代码导入了必要的Python库&#xff0c;并通过argparse设置了输入图像和面部标记预测器的参数。…...

unity | 动画模块之卡片堆叠切换

一、预览动画 可以放很多图&#xff0c;可以自己往后加&#xff0c;可以调图片x轴和y轴间距&#xff0c;可以调图片飞出方向&#xff0c;可以调堆叠方向。 图1 图片堆叠动画预览 二、纯净代码 有粉丝问我这个效果&#xff0c;最近很忙&#xff0c;没有时间细写&#xff0c;先…...

前端开发工程师需要学什么?

‌前端开发工程师需要学习的主要内容包括HTML、CSS、JavaScript、前端框架、响应式设计、性能优化、版本控制等。‌ HTML/CSS/JavaScript ‌HTML‌&#xff1a;是网页的骨架&#xff0c;负责网页的结构和内容。‌CSS‌&#xff1a;用于美化网页&#xff0c;设计样式和布局。‌…...

网络常见命令

一.添加ip地址 &#xff08;1&#xff09;先进入端口号 interface 端口号 &#xff08;2&#xff09;添加ip地址 IP address xxx.xxx.x.x 主机位 二、查看路由表&#xff08;查看192.168.3.1&#xff09; display ip routing-table 192.168.3.1 三、宣告&#xff08;宣告完后…...

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中&#xff0c;抽取出来】2、kafka作为Sink 【数据从别的地方抽取到kafka里面】 1、Kafka作为Source【数据进入到kafka中&#xff0c;抽取出来】 kafka源 --> memory --> 控制台&#xff1a; a1.sources r1 a1.sinks k1…...

springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)

引言&#xff1a; 该类博客的学习是基于b站黑马视频springbootvue视频学习&#xff01;具体围绕项目——"大事件"进行实战学习。 目录 一、功能介绍&#xff08;需求&#xff09;。 1、文章列表功能基本介绍。 2、条件分页查询功能与注意。 3、前端页面效果。&#x…...

ScreenshotToCode安装教程

网页截图生成代码&#xff0c;我测试的效果一般 快速安装教程如下 1&#xff0c;首先你得有OpenAI的账号 国内用这个代理就可以&#xff1a; https://www.closeai-asia.com/ 充值一块钱&#xff0c;在本项目中可以生成两次 2&#xff0c;下载程序 下载程序压缩包&#xff1…...

3个步骤快速掌握Windows网络性能测试:iperf3实战指南

3个步骤快速掌握Windows网络性能测试&#xff1a;iperf3实战指南 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds 还在为网络速度不稳定而烦恼吗&…...

SAP销售单抬头文本写入与读取:手把手教你用SAVE_TEXT和READ_TEXT BAPI(含完整ABAP代码)

SAP销售订单文本处理实战&#xff1a;从BAPI调用到最佳实践 在SAP项目实施过程中&#xff0c;销售订单抬头文本的自动化处理是常见需求场景。无论是特殊客户要求、内部审批备注还是物流特殊说明&#xff0c;都需要通过程序化方式精准写入和读取。对于ABAP开发者而言&#xff0c…...

Linux下Cursor IDE智能安装器:企业级Bash脚本设计与实践

1. 项目概述&#xff1a;一个为Linux而生的Cursor IDE智能安装器如果你是一名在Linux环境下工作的开发者&#xff0c;并且对Cursor这款集成了AI辅助编程能力的现代IDE感兴趣&#xff0c;那么你很可能已经遇到过那个经典难题&#xff1a;如何优雅地在Linux上安装它&#xff1f;官…...

如何利用本地自动化工具提升英雄联盟游戏体验:3个核心功能详解

如何利用本地自动化工具提升英雄联盟游戏体验&#xff1a;3个核心功能详解 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟的激烈对…...

Windows触控板手势定制终极指南:3个技巧实现高效三指拖拽优化

Windows触控板手势定制终极指南&#xff1a;3个技巧实现高效三指拖拽优化 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/ThreeFinger…...

CES 2012启示录:移动互联、生态连接与硬件创新的产业转折点

1. 从CES看消费电子行业的真实脉搏&#xff1a;一次资深记者的现场笔记 每年一月&#xff0c;拉斯维加斯都会成为全球科技界的风暴眼&#xff0c;CES&#xff08;国际消费电子展&#xff09;如期而至。对于像我这样跑了几十年科技线的老记者来说&#xff0c;CES早已超越了“展会…...

如何快速集成KYGooeyMenu:iOS粘液菜单的完整实现指南

如何快速集成KYGooeyMenu&#xff1a;iOS粘液菜单的完整实现指南 【免费下载链接】KYGooeyMenu A not bad gooey effects menu. 项目地址: https://gitcode.com/gh_mirrors/ky/KYGooeyMenu KYGooeyMenu是一款为iOS应用打造的粘液效果菜单组件&#xff0c;能为你的应用添…...

runtime.js实战部署:从本地QEMU到云端KVM的完整流程指南

runtime.js实战部署&#xff1a;从本地QEMU到云端KVM的完整流程指南 【免费下载链接】runtime [not maintained] Lightweight JavaScript library operating system for the cloud 项目地址: https://gitcode.com/gh_mirrors/runt/runtime runtime.js是一个革命性的Java…...

工业网关、电机控制、人机界面:ATSAME70Q21B-AN的应用版图

ATSAME70Q21B-AN&#xff1a;300MHz Cortex-M7工业MCU的嵌入式应用解析在工业控制、人机界面和物联网网关等领域&#xff0c;微控制器需要在处理性能、外设集成度和环境适应性之间取得平衡。ATSAME70Q21B-AN是Microchip推出的基于ARM Cortex-M7内核的高性能32位微控制器&#x…...

CANN/GE动态输入Python构图示例

样例使用指导 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前…...