C++中用Boost::Python调用Python模块

这个过程有挺多坑,记录一下。我这里的环境:

Windows 11

Qt 6.2

Boost 1.8.4

CMake 3.25.2

Visual Stutio 2019(主要用于C++编译)

1、下载并将Boost编译为静态库

b2.exe toolset=msvc-14.2 install --prefix=boost安装路径 link=static

参考:

C++ Boost库在windows下的安装与使用 - 知乎 (zhihu.com)

2、CMake中使用静态库

set(Boost_USE_STATIC_LIBS ON) add_compile_definitions(BOOST_PYTHON_STATIC_LIB)

参考:

Win10下CMakeList.txt配置使用Boost.python - 知乎 (zhihu.com)

3、Python程序

如下(foo.py):

def greeting(s):print("Get the param in Python: ", s, " \n")return "Hello, I come from Pyhon world."

4、CMake程序

cmake_minimum_required(VERSION 3.14)

project(PythonCaller LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_LIBS ON)
set(PYTHON_ROOT 编译boost时python的运行环境根路径)#例如:d:/dev/Anaconda3
add_compile_definitions(BOOST_PYTHON_STATIC_LIB)

set(PYTHON_INCLUDE ${PYTHON_ROOT}/include)
set(PYTHON_LIBRARIES ${PYTHON_ROOT}/libs/python38.lib)

add_definitions(-DBOOST_PYTHON_NO_ASSERT)

find_package(Boost REQUIRED COMPONENTS python system)

include_directories(${PYTHON_INCLUDE} ${Boost_INCLUDE_DIRS})

MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARIES}. ")
MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}.")
MESSAGE( STATUS "Boost_LIBRARY_DIRS = ${Boost_LIBRARY_DIRS}.")
MESSAGE( STATUS "Boost_PYTHON_LIBRARY = ${Boost_PYTHON_LIBRARY}.")

add_executable(PythonCaller main.cpp)


target_link_libraries(PythonCaller ${Boost_PYTHON_LIBRARY} ${PYTHON_LIBRARIES})

5、C++程序

#include <boost/python.hpp> // Boost.Python
#include <iostream>
#include <string>namespace py=boost::python;int main(int argc, char* argv[])
{Py_Initialize(); // 初始化 Python 解释器try{//导入模块 hello(hello.py)py::object hello = boost::python::import("foo");//获取属性(函数、类等)py::object greeting = hello.attr("greeting");//执行Python函数py::object py_res = greeting("Hello, I come from C++ world.");//转换并返回结果(使用 boost::python::extract 转换)std::string res = py::extract<std::string>(py_res);std::cout << "Get the result from python: " << res << std::endl;}catch (const boost::python::error_already_set&){PyErr_Print();return -1;}Py_Finalize(); // 终止 Python 解释器return 0;
}

要注意头文件包含顺序,把”#include <boost/python.hpp>“放在STL包含头文件之前,否则报错:

xxx\Boost\1_84_0\include\boost-1_84\boost/assert/source_location.hpp(102): error C2039: "_snprintf": 不是 "std" 的成员

参考:

'_snprintf': is not a member of 'std' · Issue #32 · boostorg/system · GitHub

6、运行时设置python环境变量

需要设置Python环境变量。在Windows中执行如下命令(Linux用export命令):

set PYTHONHOME=Python环境根目录

否则C++ Boost调用python报错:

init_fs_encoding:failed to get the Python codec of the file

原因是python的环境变量没有配置好。

set PYTHONHOME=Python环境根目录

参考:

【BUG】C++ Boost调用python报错:init_fs_encoding:failed to get the Python codec of the file_fatal python error: init_fs_encoding: failed to ge-CSDN博客

7、运行结果

Get the param in Python:  Hello, I come from C++ world.

Get the result from python: Hello, I come from Pyhon world.

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

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

相关文章

数据链路层DoS

图9-14 集线器应用原理 数据链路层中拒绝服务攻击的方式一般很少为人所熟知。数据链路层拒绝服 务攻击的主要目标为二层交换机。在早期网络中&#xff0c;通常都会使用集线器作为中间 处理设备。集线器属于纯硬件网络底层设备&#xff0c;没有任何“ 智能记忆” 能力和“学 …

Python高级属性访问使用方法

Python中的高级属性访问是指通过特殊的方法来实现对属性的访问和操作。以下是几个常用的高级属性访问方法: getattr__和__setattr: __getattr__方法在访问不存在的属性时被调用,可以在方法中实现自定义的默认值或错误处理逻辑。__setattr__方法在给属性赋值时被调用,可以在…

云安全领域前瞻:2024年五大瞩目趋势解析

综述 随着2024年对生成型人工智能的炒作达到顶峰&#xff0c;这种类型的人工智能将对攻击者和安全团队的行动产生重大影响。尽管生成式人工智能不会是一些人期待的灵丹妙药&#xff0c;但它将提升我们执行任务的能力&#xff0c;例如检测异常、预测威胁和自动响应安全事件。 …

Airtest实现在手机界面快速批量采集数据

Airtest实现在手机界面快速批量采集数据 一、问题 Airtest使用的poco方法比较慢,寻找差不多一周,看完这篇文章能节省一周时间,希望帮到大家。二、解决思路 使用Airtest图像识别,这样就会速度上提升效率。 三、解决办法 使用页面规律,要找到每条数据的附近规律(一般是图…

发廊理发店微信小程序展示下单前端静态模板源码

模板描述&#xff1a;剪发小程序前端源码&#xff0c;一共五个页面&#xff0c;包括店铺、理发师、订单、我的等页面 注&#xff1a;该源码是前端静态模板源码&#xff0c;没有后台和API接口

代码随想录训练营第三十期|第二十九天|回溯算法part05|491.递增子序列* 46.全排列* 47.全排列 II

491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution {public List<List<Integer>> findSubsequences(int[] nums) {List<List<Integer>> res new ArrayList<>();List<Integer> list new ArrayList<>();df…

PCIE和USB 耦合电容放置位置记录- 一般放置在TX端

PCIE耦合电容位置 以下为引用内容&#xff0c;为记录而做的本篇文章&#xff1a; 1、PCIe标准里面明确规定&#xff1a;当两个设备通过连接器互联时&#xff0c;必须放置交流耦合电容到TX端&#xff1b; 2、放远放近最大的不同时高速信号传输中的介质损耗和趋肤效应不同&#…

【Git】08 多人单分支协作场景

文章目录 一、场景1&#xff1a;不同人修改不同文件1.1 场景描述1.2 场景复现1.2.1 克隆到本地1.2.2 新建分支1.2.3 B修改、提交与推送1.2.4 A修改与提交1.2.5 B再次修改并推送1.2.6 A推送报错 1.3 解决 二、场景2&#xff1a;不同人修改同文件的不同区域2.1 场景描述2.2 场景复…

c# Zip压缩解压缩

public class ZipHelper { #region ZipFile 压缩文件 /// <summary> /// 压缩 /// </summary> /// <param name"strDirectory">要压缩的目录</param> /// <param name"zipFile"&g…

python:lxml 读目录.txt文件,用 xmltodict 转换为json数据,生成jstree所需的文件

请参阅&#xff1a;java : pdfbox 读取 PDF文件内书签 请注意&#xff1a;书的目录.txt 编码&#xff1a;UTF-8&#xff0c;推荐用 Notepad 转换编码。 pip install lxml ; lxml-5.1.0-cp310-cp310-win_amd64.whl (3.9 MB) pip install xmltodict ; lxml 读目录.txt文件&…

计算机网络概念、组成、功能和分类

文章目录 概要1.怎么学习计算机网络2.概念3.功能、组成4.工作方式、功能组成5.分类 概要 概念、组成、功能和分类 1.怎么学习计算机网络 2.概念 通信设备&#xff1a;比如路由器、路由器 线路&#xff1a;将系统和通信设备两者联系的介质之类的 计算机网络是互连的、自治的的计…

如何设计一个预约抢购活动

总体架构设计 互联网大量数据的存储设计 1&#xff09;哈希算法&#xff0c;对商品ID进行分片 节点取模的形式&#xff0c;优点是均匀分布&#xff0c;缺点是扩展性不好。所以&#xff0c;我们可以采用一致性hash。 一致性HASH的优点&#xff1a; 解决单一热点问题&#xf…

3060ti显卡+cuda12.1+win10编译安装生成fastdeploy的c++与python库

在cuda12中,调用官方发布的fastdeploy会出现报错,故此自行编译fastdeploy库。 官网编译教程:https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/cn/build_and_install/gpu.md 可选编译选项 编译选项 无论是在何平台编译,编译时仅根据需求修改如下选项,勿…

分布式springboot 3项目集成mybatis官方生成器开发记录

文章目录 说明实现思路实现步骤第一步&#xff1a;创建generator子模块第二步&#xff1a;引入相关maven插件和依赖第三步&#xff1a;编写生成器配置文件第四步&#xff1a;运行查看结果 说明 该文章为作者开发学习记录&#xff0c;方便以后复习和交流主要内容为&#xff1a;…

MGIE官网体验入口 苹果多模态大语言模型AI图像编辑工具在线使用地址

MGIE是一项由苹果开源的技术&#xff0c;利用多模态大型语言模型&#xff08;MLLMs&#xff09;生成图像编辑指令&#xff0c;通过端到端训练&#xff0c;捕捉视觉想象力并执行图像处理操作&#xff0c;使图像编辑更加智能、直观。 MGIE官网体验入口https://github.com/apple/M…

Mybatis- plus 基本使用

目录 一. 引入依赖 二.定义Mapper 三.常见注解 3.1TableName 3.2.TableId 3.3TableField 3.4常见配置 一. 引入依赖 由于这个starter包含对mybatis的自动装配&#xff0c;因此完全可以替换掉Mybatis的starter。 <dependency><groupId>com.baomidou</gr…

人工智能之估计量评估标准及区间估计

评估估计量的标准 无偏性:若估计量( X 1 , X 2 , ⋯   , X n X_1,X_2,\cdots,X_n X1​,X2​,⋯,Xn​)的数学期望等于未知参数θ,即 E ( θ ^ ) = θ E(\hat\theta)=\theta E(θ^)=θ 则称 θ ^ \hat\theta θ^为θ的无偏估计量。 估计量 θ ^ \hat\theta θ^的值不一定就是…

Python: pip install -e

pip install -e . 该命令会执行当前目录下的setup.py文件,将当前项目以editable mode安装&#xff1b; # pip 文档 https://pip.pypa.io/en/stable/cli/pip_install/ # Editable Install vs. Regular Install https://pip.pypa.io/en/stable/topics/local-project-install…

Python 装饰器的理解

装饰器是一个特殊的函数&#xff0c;它接受一个函数作为参数&#xff0c;并返回一个新的函数。 通过使用装饰器&#xff0c;可以在不修改原始函数代码的情况下扩展其功能&#xff0c;增加代码的灵活性和可维护性。 装饰器在定义之后立即跟在需要被装饰的函数的定义之前&#…

Vivado -RAM

ip_ram 定义了一个名为ip_ram的模块&#xff0c;该模块具有以下端口&#xff1a; sys_clk&#xff1a;系统时钟输入。 sys_rst_n&#xff1a;系统复位输入。 module ip_ram( input sys_clk, input sys_rst_n);wire ram_en ; wire ram_wea …