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

Ubuntu 下使用 Pybind11 实现 C++ 调用 Python 接口的示例

Pybind11 是一个轻量级的库,它提供了在 C++ 中无缝集成 Python 代码的能力。使用 Pybind11,你可以很容易地从 C++ 调用 Python 代码,反之亦然。下面我将通过一个简单的例子来展示如何在 Ubuntu 系统上使用 Pybind11 从 C++ 调用 Python 接口。

安装 Pybind11

首先,确保你的系统已经安装了 Python 和 C++ 编译器。接下来,你可以通过 pip 安装 Pybind11:

pip3 install pybind11

或者,你可以从源代码安装 Pybind11,如果你需要更高级的自定义选项(推荐):

git clone https://github.com/pybind/pybind11.git
cd pybind11
mkdir build
cd build
cmake ..
make check -j 4
sudo make install

报错!!!

解决办法: 

pip3 install pytest

安装在标准路径:

示例:C++ 调用 Python 函数

假设我们有一个 Python 脚本 add_numbers.py,它包含一个简单的函数,如下所示:

add_numbers.py

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

CMakeLists.txt

# 设置 CMake 的最低版本要求和项目名称
cmake_minimum_required(VERSION 3.10)
# 项目名称可以被用作变量等多种用途。
project(test)# 这行命令让 CMake 寻找 Python 3.6 版本(或更高)的库。REQUIRED 表示这个包是必需的;如果找不到,CMake 会报错。
find_package(PythonLibs 3.6 REQUIRED)
# 这行命令让 CMake 寻找 Pybind11 库。同样地,REQUIRED 表示 Pybind11 是构建此项目所必需的。
find_package(pybind11 REQUIRED )# 这个命令用于向项目添加头文件搜索路径。
# 这里,${PYTHON_INCLUDE_DIRS} 和 ${pybind11_INCLUDE_DIRS} 是由 find_package 命令找到的 Python 和 Pybind11 的头文件目录。
# 这确保了编译器可以找到所有必需的头文件。
include_directories(${PYTHON_INCLUDE_DIRS})
include_directories(${pybind11_INCLUDE_DIRS})# 这行命令定义了一个名为 test 的可执行文件,它将从 main.cpp 源文件构建而成。
add_executable(test main.cpp)# 指定了构建可执行文件 test 时需要链接的库。
# ${PYTHON_LIBRARIES} 是 find_package(PythonLibs) 命令找到的 Python 库,
# 而 pybind11::pybind11 是 Pybind11 提供的目标,用于链接 Pybind11 库。这确保了项目在链接时能找到所有必要的库。
target_link_libraries(test ${PYTHON_LIBRARIES} pybind11::pybind11)

main.cpp

// pybind11/pybind11.h:这是 Pybind11 的主要头文件,提供了大部分 Pybind11 功能。
#include <pybind11/pybind11.h>
// pybind11/embed.h:这个头文件提供了嵌入 Python 解释器到 C++ 应用中所需的功能。这意味着你可以在 C++ 程序中启动和使用 Python 解释器。
#include <pybind11/embed.h>
#include <iostream>// 创建了一个别名 py,代表 pybind11 命名空间,使得后续可以通过 py 来访问 pybind11 的各种功能。
namespace py = pybind11;
using namespace std;int main() {// 这里创建了一个 scoped_interpreter 实例。这个对象的生命周期控制着 Python 解释器的启动和关闭。// 当 guard 被创建时,Python 解释器启动;当 guard 的生命周期结束时(函数返回时),Python 解释器关闭。py::scoped_interpreter guard{};// 这几行代码导入了 Python 的 sys 模块,并使用 sys.path.append 方法添加了一个目录到 Python 的模块搜索路径中。// 这样,Pybind11 就可以找到并导入位于 /home/fairlee/Programs 目录下的 Python 脚本。py::module_ sys = py::module_::import("sys");sys.attr("path").attr("append")("/home/fairlee/Programs");// 上面的代码导入了名为 hello 的 Python 模块(假设这个模块位于之前添加到 sys.path 的目录中)。// 然后,它调用了 hello 模块中的 add_numbers 函数,传入两个参数(9 和 3.14),并将返回的结果转换为 double 类型。// 这里使用了 Pybind11 的 attr 方法来访问和调用 Python 中的属性和方法。py::module_ calc = py::module_::import("hello");auto result = calc.attr("add_numbers")(9, 3.14).cast<double>();// 最后,使用标准输出将结果打印到控制台。这里的 result 就是从 Python 函数 add_numbers 返回的结果。std::cout << "The result is: " << result << std::endl;return 0;
}

编译成功后,你可以运行生成的可执行文件。C++ 程序将调用 Python 脚本中定义的加法函数,计算并打印出 9 + 3.14 的结果。

相关文章:

Ubuntu 下使用 Pybind11 实现 C++ 调用 Python 接口的示例

Pybind11 是一个轻量级的库&#xff0c;它提供了在 C 中无缝集成 Python 代码的能力。使用 Pybind11&#xff0c;你可以很容易地从 C 调用 Python 代码&#xff0c;反之亦然。下面我将通过一个简单的例子来展示如何在 Ubuntu 系统上使用 Pybind11 从 C 调用 Python 接口。 安装…...

docker安装和使用kafka

1. 启动zookeeper Kafka依赖zookeeper, 首先安装zookeeper -p&#xff1a;设置映射端口&#xff08;默认2181&#xff09; docker run --name zookeeper \--network app-tier \-e ALLOW_ANONYMOUS_LOGINyes \--restartalways \-d bitnami/zookeeper:latest2. 启动kafka docker…...

CTP-API开发系列之接口对接准备

CTP-API开发系列之接口对接准备 CTP-API开发系列之接口对接准备CTP-API文件清单CTP-API通用规则命名规则Spi与Api CTP-API通讯模式开发语言选择 CTP-API开发系列之接口对接准备 CTP-API文件清单 文件名说明ThostFtdcTraderApi.h交易接口&#xff0c;C头文件&#xff0c;包括 …...

C++小记 -链表

链表 文章目录 链表链表基础理论链表的类型单链表双链表循环链表 链表的存储方式链表的定义链表的操作添加节点删除节点 性能分析构建链表删除节点&#xff08;内存泄漏的坑&#xff09;1.直接移除2.使用虚拟头结点3.delete指针后&#xff0c;要将指针置为NULL&#xff01;&…...

网络协议学习DAY1

1.网络协议模型: OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&#xff08;数据报、流式&#xff09; 网…...

vue3中全局变量的定义和获取

在vue项目中&#xff0c;我们知道vue2定义全局变量是在main.js文件将变量挂载到vue.prototype.name"lisi"&#xff0c;在页面通过this.name去调用。但是在vue3中&#xff0c;这个定义全局变量有所改变&#xff1a; const app createApp(App) app.config.globalProp…...

1.2 数据模型 数据库系统概论

目录 1.2.1 两类数据模型 1.2.2 概念模型 1.信息世界中的基本概念 &#xff08;1&#xff09;实体 &#xff08;2&#xff09;属性 &#xff08;3&#xff09;码 &#xff08;4&#xff09;实体型 &#xff08;5&#xff09;实体集 &#xff08;6&#xff09;联系 2.…...

C#中openFileDialog 对话框不在最顶层,TopMost的异常情况

重点&#xff01;&#xff01;&#xff01;若 当前窗体this的TopMost是false&#xff0c;可以设置为true&#xff0c;这样打开的对话框就是最顶层 /// <summary> /// 设置窗体TopMost&#xff0c;缺点和其他程序ide有冲突。例如VS有断点的调试会卡死 /// </summary&g…...

信息安全与阿里云等保三级方案实践总结

信息安全在当今数字化时代变得至关重要&#xff0c;企业和组织需要采取有效措施来保护其数据和信息资产。阿里云作为中国领先的云服务提供商&#xff0c;提供了等保三级方案&#xff0c;帮助用户满足国家信息安全等级保护的要求。本文将探讨信息安全和阿里云等保三级方案的重要…...

嵌入式学习记录——线程

线程基本概念: 线程:线程是一个轻量级的进程,位于进程空间内部,一个进程中可以创建多个线程 1.线程创建: 线程独占栈空间,文本段、数据段和堆区与进程共享 2.线程调度: 与进程调度是一样的 宏观并行,微观串行 3.线程消亡: 与进程消亡是一样的 4.进程和线程…...

同步服务器操作系统公网仓库到本地 _ 统信UOS _ 麒麟KYLINOS

原文链接&#xff1a;同步服务器操作系统公网仓库到本地 | 统信UOS | 麒麟KYLINOS 在如今快速发展的信息技术时代&#xff0c;维护和更新服务器操作系统变得越来越重要。无论是为了提高安全性、增加新功能还是提升系统稳定性&#xff0c;同步公网源仓库到本地都是一个关键步骤。…...

【数仓】flume常见配置总结,以及示例

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…...

统计信息锁定

在导入成功后我要收集下这些表的信息&#xff0c;结果发现好几张表都没法收集&#xff0c;用DBMS_STATS包显示ORA-20005&#xff1a;object statistics are locked (stattype ALL)&#xff0c;用Analyze命令显示ORA-38029&#xff1a; 对象统计信息已锁定。 解决办法很明确&a…...

光猫改为bridge模式

注意事项&#xff1a; 改成桥接模式后&#xff0c;光猫将不再拨号上网&#xff0c;建议提前记录自己的宽带账号&#xff0c;打10010申请修改自己的宽带密码。 光猫改好桥接之后&#xff0c;把宽带账号和密码输入到负责拨号上网的终端设备中&#xff0c;完成宽带PPPOE拨号设置。…...

回溯算法01-组合(Java)

1.组合 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]示例 2&#xff1a; 输入&#x…...

初始网络 --- 网络基础

目录 0、 前言 1、 计算机网络发展背景 1.1. 局域网(LAN) && 广域网(WAN) 2、 认识并理解协议 3、 初始网络协议 3.1. 协议分层 4、 TCP/IP 五层(或四层)模型 4.1. 简单了解TCP/IP层状体系 4.2. TCP/IP协议层状结构和计算机层状结构的关系 5、 OSI七层模型 …...

在Linux/Ubuntu/Debian中计算MD5,SHA256的方法

MD5&#xff08;消息摘要算法 5&#xff09;和 SHA-256&#xff08;安全哈希算法 256 位&#xff09;等流行的哈希算法广泛用于从任意数据生成固定大小的哈希值或校验和。 以下是这些算法及其计算方式的简要概述&#xff1a; MD5&#xff08;消息摘要算法5&#xff09;&#x…...

mybatis mysql insert 主键id为空

错误示范 java代码设置了param参数&#xff0c;但是sql 字段没有带上参数&#xff0c;例如 void insertV2(Param("historyDO") HistoryDO historyDO); <insert id"insertDuplicate" parameterType"com.test.entity.HistoryDO"keyProperty&…...

批次大小对ES写入性能影响初探

问题背景 ES使用bulk写入时每批次的大小对性能有什么影响&#xff1f;设置每批次多大为好&#xff1f; 一般来说&#xff0c;在Elasticsearch中&#xff0c;使用bulk API进行批量写入时&#xff0c;每批次的大小对性能有着显著的影响。具体来说&#xff0c;当批量请求的大小增…...

c语言十大核心用法

当然&#xff0c;以下是十个关于 C 语言用法的代码示例&#xff1a; 指针的基本用法&#xff1a; #include <stdio.h>int main() {int num 10;int *ptr;ptr &num;printf("The value of num is: %d\n", *ptr);return 0; }结构体的使用&#xff1a; #in…...

Pixel Script Temple 为C++高性能计算项目生成优化脚本

Pixel Script Temple 为C高性能计算项目生成优化脚本 1. 高性能计算开发的痛点 在C高性能计算领域&#xff0c;开发者经常面临一个共同困境&#xff1a;明明硬件资源充足&#xff0c;但程序性能就是上不去。你可能也遇到过这样的情况 - 代码逻辑没问题&#xff0c;算法也正确…...

[高级配置]:解决Insyde BIOS隐藏选项访问难题的开源工具技术指南

[高级配置]&#xff1a;解决Insyde BIOS隐藏选项访问难题的开源工具技术指南 【免费下载链接】LEGION_Y7000Series_Insyde_Advanced_Settings_Tools 支持一键修改 Insyde BIOS 隐藏选项的小工具&#xff0c;例如关闭CFG LOCK、修改DVMT等等 项目地址: https://gitcode.com/gh…...

Qwen3.5-4B-Claude-Opus-GGUF部署教程:llama-server API对接与Web前端联调

Qwen3.5-4B-Claude-Opus-GGUF部署教程&#xff1a;llama-server API对接与Web前端联调 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是基于Qwen3.5-4B的推理蒸馏模型&#xff0c;特别强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能力。该版本…...

FGA智能自动战斗全攻略:解放双手,高效玩转F/GO

FGA智能自动战斗全攻略&#xff1a;解放双手&#xff0c;高效玩转F/GO 【免费下载链接】FGA FGA - Fate/Grand Automata&#xff0c;一个为F/GO游戏设计的自动战斗应用程序&#xff0c;使用图像识别和自动化点击来辅助游戏&#xff0c;适合对游戏辅助开发和自动化脚本感兴趣的程…...

HighwayEnv完全指南:10分钟快速上手自动驾驶强化学习环境

HighwayEnv完全指南&#xff1a;10分钟快速上手自动驾驶强化学习环境 【免费下载链接】HighwayEnv A minimalist environment for decision-making in autonomous driving 项目地址: https://gitcode.com/gh_mirrors/hi/HighwayEnv HighwayEnv是一个轻量级的自动驾驶决…...

Dockle在大型项目中的应用:多镜像批量扫描与报告生成完整指南

Dockle在大型项目中的应用&#xff1a;多镜像批量扫描与报告生成完整指南 【免费下载链接】dockle Container Image Linter for Security, Helping build the Best-Practice Docker Image, Easy to start 项目地址: https://gitcode.com/gh_mirrors/do/dockle Dockle是一…...

「码动四季·开源同行」golang:负载均衡如何提高系统可用性?

负载均衡能够将大量的请求&#xff0c;根据负载均衡算法&#xff0c;分发到多台服务器上进行处理&#xff0c;使得所有服务器负载都维持在高效稳定的状态&#xff0c;以提高系统的吞吐量。此外&#xff0c;多个服务实例组成的服务集群&#xff0c;消除了单点问题&#xff0c;当…...

路沿模板,乐山水泥路面模板,40公分路面钢模哪里有名

打路面模板&#xff1a;乐山水泥路面的优质之选在道路建设中&#xff0c;打路面模板起着至关重要的作用。它不仅关系到路面的成型质量&#xff0c;还影响着整个工程的效率和成本。乐山地区对于道路建设的需求不断增加&#xff0c;尤其是在水泥路面的铺设方面&#xff0c;40公分…...

云容笔谈在自媒体内容生产中的提效实践:日更国风配图效率提升300%

云容笔谈在自媒体内容生产中的提效实践&#xff1a;日更国风配图效率提升300% 1. 自媒体内容创作的痛点与挑战 作为自媒体创作者&#xff0c;每天最头疼的就是配图问题。特别是做国风内容的账号&#xff0c;既要保持东方美学韵味&#xff0c;又要保证日更频率&#xff0c;传统…...

5分钟精通Meld文件对比工具:效率倍增的3大场景实战指南

5分钟精通Meld文件对比工具&#xff1a;效率倍增的3大场景实战指南 【免费下载链接】meld Read-only mirror of https://gitlab.gnome.org/GNOME/meld 项目地址: https://gitcode.com/gh_mirrors/me/meld Meld是一款开源的可视化文件对比工具&#xff0c;能够帮助开发者…...