C++ 调用 Python(通过Boost.Python)
本文将用一个小的示例来展示如何通过Boost.Python
来实现 C++/Python 混合编程从而将两种语言的优势整合到一起。
1. CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(test_boost_python LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Boost REQUIRED COMPONENTS python system)
include_directories( /usr/include/python3.8 ) # 笔者电脑上安装的是 Python 3.8
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${Boost_LIBRARIES} python3.8 )
2. main.cpp
#include <iostream>
#include <string>
#include <boost/python.hpp> // Boost.Python
int main(int argc, char* argv[])
{
// 添加模块代码所在路径(Python脚本文件的路径)
setenv("PYTHONPATH", ".", 1);
Py_Initialize(); // 初始化 Python 解释器
try
{
// 1. 导入模块 hello(hello.py)
boost::python::object hello = boost::python::import("hello");
// 2. 获取属性(函数、类等)
boost::python::object greeting = hello.attr("greeting");
// 3. 执行Python函数
boost::python::object res = greeting("2022.04.23");
// 其中第2步和第3步可以合并为
// boost::python::object res = hello.attr("greeting")("2022.04.23");
// 4. 打印返回结果(使用 boost::python::extract 转换)
std::string tmp = boost::python::extract<std::string>(res);
std::cout << tmp << " ... C++" << std::endl;
}
catch (const boost::python::error_already_set&)
{
PyErr_Print();
return 1;
}
Py_Finalize(); // 终止 Python 解释器
return 0;
}
3. hello.py
def greeting( val ):
print("Hello world from Python...",val," \n")
return "WOAINI"
4. 运行结果
main.cpp
第 8 行代码指定 Python 文件要放置在当前路径(工作目录)下。程序运行结果如下
参考资料
How to import a function from python file by Boost.Python
Boost::Python Extract -- Accessing Python string in C++
Boost Python Python return value to C++ program
C++ 调用 Python(通过Boost.Python)的更多相关文章
- Boost.Python简介
Boost.Python简单概括:是Boost库的一部分:用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针. 以下内容搬运自:https://wi ...
- boost.python编译及演示样例
欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46781581 linux编译boost的链接:http://bl ...
- boost::python的使用
boost::python库是pyhon和c++相互交互的框架,可以再python中调用c++的类和方法,也可以让c++调用python的类和方法 python自身提供了一个Python/C AP ...
- 使用Boost.Python构建混合系统(译)
目录 Building Hybrid Systems with Boost.Python 摘要(Abstract) 介绍(Introduction) 设计目标 (Boost.Python Design ...
- 【转】Boost.Python
http://edyfox.codecarver.org/html/boost_python.html Boost.Python 是 Boost 中的一个组件,使用它能够大大简化用 C++ 为 Pyt ...
- [转]vs2010用 boost.python 编译c++类库 供python调用
转自:http://blog.csdn.net/wyljz/article/details/6307952 VS2010建立一个空的DLL 项目属性中配置如下 链接器里的附加库目录加入,python/ ...
- boost.python笔记
boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...
- 64位win7下安装Boost 1.59.0 + boost.python 1.59.0 + gccxml + pygccxml + pyplusplus(py++)
由于安装过程中实在是出现了N多问题,所以不得不专门写个帖子来记录一下这破东西在Win7下的安装过程,避免以后还要再用的时候踩坑. 1.Boost简介 Boost库是一个可移植.提供源代码的C++库,作 ...
- Win7 VS2017 Boost Python入门
闲来无事想练习下用Python作为游戏脚本绑定到C++,网上搜了下,Python文档有些例子,但是太过复杂,gayhub无意中看到有人用Boost Python绑定,简单粗暴,省时省力,记录备忘. 写 ...
随机推荐
- [BJDCTF2020]The mystery of ip|[CISCN2019 华东南赛区]Web11|SSTI注入
记录一下BUUCTF中两个类似的SSTI注入关卡 [BJDCTF2020]The mystery of ip-1: 1.打开之后显示如下: 2.在hint.php中进行了相关提示,如下: 3.既然获取 ...
- NC14893 栈和排序
NC14893 栈和排序 题目 题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组进行从大到小排序 当无法完全排序时,请输出字典序最大的出栈序列 输入描 ...
- 阿里云有奖体验:用PolarDB-X搭建一个高可用系统
体验简介 场景将提供一台配置了CentOS 8.5操作系统和安装部署PolarDB-X集群的ECS实例(云服务器).通过本教程的操作,带您体验如何使用PolarDB-X搭建一个高可用系统,通过直接ki ...
- P3480 [POI2009]KAM-Pebbles 题解
题目链接 首先,这道题看上去就是个博弈论,很显然的 \(Nim\) 游戏. 因为每一个的取法都和它的上一位有关. 有一种非常显然的转换方式 :我们把这若干堆石子从前向后做一个差分 . 我们记 \(a_ ...
- 搭建企业级实时数据融合平台难吗?Tapdata + ES + MongoDB 就能搞定
摘要:如何打造一套企业级的实时数据融合平台?Tapdata 已经找到了最佳实践,下文将以 Tapdata 的零售行业客户为例,与您分享:基于 ES 和 MongoDB 来快速构建一套企业级的实时数 ...
- C++ delete后的指针在不同编译器下的状态差异
今天看到小伙伴分享的一个问题,小伙伴用的MSVC2019编译器,在对delete后的指针进行取值操作时触发了访问冲突. #include<iostream> using namespace ...
- if else 还在用吗?
当我们在使用if else 的时候,你是否闻到代码的坏味道呢? 除非非常简单的逻辑,当我们在写一大坨if else的时候,就应该审视一下是否这样写合适呢?是否这一坨代码体现某一个业务语义呢?是否体现领 ...
- java.super详解
package Demo.oop.APP.Demo03; //demo3包的启动器 //此启动器用于继承 public class application { public static void m ...
- 论文阅读 A Data-Driven Graph Generative Model for Temporal Interaction Networks
13 A Data-Driven Graph Generative Model for Temporal Interaction Networks link:https://scholar.googl ...
- 如何优雅的升级 Flink Job?
Flink 作为有状态计算的流批一体分布式计算引擎,会在运行过程中保存很多的「状态」数据,并依赖这些数据完成任务的 Failover 以及任务的重启恢复. 那么,请思考一个问题:如果程序升级迭代调整了 ...