使用boost.python封装C++库
使用boost.python封装C++库
C++以高性能著称,但是编写较为复杂.而简洁是Python的强项.如果能珠联璧合,就能发挥两家之长.本文尝试用boost库的python模块封装C++
前期准备
需要安装Python和boost库,特别注意的是,在安装boost时,要指明with-python的版本
sudo apt install python3-dev build-essential
git clone https://github.com/boostorg/boost.git
cd boost
./bootstrap.sh --with-python=python3.5 # python3.6的话就写3.6
./b2
sudo ./b2 install
项目结构
➜ py3 tree
.
├── CMakeLists.txt
├── demo.cpp
├── demo.h
└── pymodule.cpp
1. CMakeLists.txt
#CMakeLists.txt
cmake_minimum_required(VERSION 3.5) #CMake的最低版本要求
project(demo)
set(CMAKE_CXX_STANDARD 11)
# 添加Python包
find_package(PythonLibs 3.5 REQUIRED)
include_directories(${PYTHON_INCLUDE_DIR})
# 添加Boost包
find_package(Boost COMPONENTS python3 REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
# 生成动态链接库
set(PYMODULE "cpp_py_module")
set(SOURCE_FILES pymodule.cpp demo.cpp demo.h)
add_library(${PYMODULE} SHARED ${SOURCE_FILES})
target_link_libraries(${PYMODULE} ${Boost_LIBRARIES})
set_target_properties(${PYMODULE} PROPERTIES PREFIX "") # 去掉前缀,否则会生成lib***.so
2. demo.h
//demo.h
#ifndef DEMO_H_
#define DEMO_H_
#include <string>
class Person
{
public:
Person(std::string name, int age);
std::string getName();
int getAge();
private:
std::string name;
int age;
};
double add(double a, double b);
#endif // DEMO_H_
3. demo.cpp
//demo.cpp
#include "demo.h"
Person::Person(std::string name, int age)
{
this->name = name;
this->age = age;
}
std::string Person::getName()
{
return name;
}
int Person::getAge()
{
return age;
}
double add(double a, double b)
{
return a + b;
}
4. pymodule.cpp
#include "demo.h"
#include <boost/python.hpp>
// module名要和CMakeLists.txt中生成的so目标名一致
BOOST_PYTHON_MODULE(cpp_py_module)
{
using namespace boost::python;
class_<Person>("Person",
init<std::string, int>()) // 构造函数
.def("getName", &Person::getName) // 成员函数
.def("getAge", &Person::getAge);
def("add", add); // 普通函数
}
测试
编译生成动态链接库
cmake .
make
会在当前目录下生成cpp_py_module.so
在当前目录下用python3测试模块
In [1]: import cpp_py_module
In [2]: cpp_py_module.add(4, 5)
Out[2]: 9.0
In [3]: p = cpp_py_module.Person("Jack", 25)
In [4]: p.getName()
Out[4]: 'Jack'
In [5]: p.getAge()
Out[5]: 25
小结
Python作为胶水语言真是名副其实,这样就可以用Python解决输入格式之类的dirty work,然后C++解决密集计算.
使用Boost还有一个好处就是不用修改原来的C++代码,只要外面加一层pymodule.cpp的wrapper就好了,简洁明了.
使用boost.python封装C++库的更多相关文章
- 使用Boost.Python构建混合系统(译)
目录 Building Hybrid Systems with Boost.Python 摘要(Abstract) 介绍(Introduction) 设计目标 (Boost.Python Design ...
- python学习笔记:安装boost python库以及使用boost.python库封装
学习是一个累积的过程.在这个过程中,我们不仅要学习新的知识,还需要将以前学到的知识进行回顾总结. 前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数, C+ ...
- 【转】利用Boost.Python将C++代码封装为Python模块
用Boost.Python将C++代码封装为Python模块 一. 基础篇 借助Boost.Python库可以将C/C++代码方便.快捷地移植到python模块当中,实现对python模块的扩 ...
- boost.python笔记
boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...
- Boost.Python简介
Boost.Python简单概括:是Boost库的一部分:用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针. 以下内容搬运自:https://wi ...
- 64位win7下安装Boost 1.59.0 + boost.python 1.59.0 + gccxml + pygccxml + pyplusplus(py++)
由于安装过程中实在是出现了N多问题,所以不得不专门写个帖子来记录一下这破东西在Win7下的安装过程,避免以后还要再用的时候踩坑. 1.Boost简介 Boost库是一个可移植.提供源代码的C++库,作 ...
- boost.python入门教程 ----python 嵌入c++
Python语言简介 Python是一种脚本语言.以开放的开发接口和独特的语法著称.尽管Python在国内引起注意只有几年的时间,但实际上Python出现于上世纪90年代(据www.python.or ...
- boost.python编译及演示样例
欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46781581 linux编译boost的链接:http://bl ...
- 【转】Boost.Python
http://edyfox.codecarver.org/html/boost_python.html Boost.Python 是 Boost 中的一个组件,使用它能够大大简化用 C++ 为 Pyt ...
随机推荐
- 记一次504 Gateway Time-out
使用curl请求是超时,查了下资料原来是端口被占用,造成了死锁,记录下 首先要知道为什么会出现死锁? 在我们访问页面的时候这个端口进程就已经被使用,当我们再在页面中curl请求其他页面因为没有其他的端 ...
- 第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP)
一. 并行编程 1. 区分串行编程和串行编程 ①. 串行编程:所谓的串行编程就是单线程的作用下,按顺序执行.(典型代表for循环 下面例子从1-100按顺序执行) ②. 并行编程:充分利用多核cpu的 ...
- [物理学与PDEs]第5章习题7 各向同性材料时稳定性条件的等价条件
在线性弹性时, 证明各向同性材料, 稳定性条件 (5. 27) 等价于 Lam\'e 常数满足 $$\bex \mu>0,\quad \lm+\cfrac{2}{3}\mu>0. \ee ...
- 使用 MERGE 语句实现增删改
Ø 简介 在平常编写增删改的 SQL 语句时,我们用的最多的就是 INSERT.UPDATE 和 DELETE 语句,这是最基本的增删改语句.其实,SQL Server 中还有另外一个可以实现增删改 ...
- 有趣的若干个AI项目
一.遗传算法跑贪吃蛇 1.下载processing,下载地址是:https://processing.org/download ,直接解压打开即可. 2.下载SnakeAI源码,下载地址是:https ...
- 用juery的ajax方法调用aspx.cs页面中的webmethod方法
首先在 aspx.cs文件里建一个公开的静态方法,然后加上WebMethod属性. 如: [WebMethod] public static string GetUserName() { //.... ...
- JavaWeb - apache和tomcat是如何配合工作的
ref: https://jingyan.baidu.com/article/47a29f246f354ec0142399dc.html 网上有很多的介绍apache和tomcat的区别,但大部分都是 ...
- vue之vuex学习
知识点一:vuex是状态管理器(单向数据流) 每个Vuex应用程序的核心是商店.“商店”基本上是一个容纳您的应用程序状态的容器.有两件事使Vuex商店与普通的全局对象不同: Vuex商店是被动的.当V ...
- 038_nginx backlog配置
一. backlog=number sets the backlog parameter in the listen() call that limits the maximum length for ...
- memcached性能测试之Twemperf
Twemperf又名mcperf,是一款memcached的性能测试工具.Mcperf就像httperf,但它基于memcached的协议,它使用memcached的ASCII协议并且能够快速的产生大 ...