使用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++库的更多相关文章

  1. 使用Boost.Python构建混合系统(译)

    目录 Building Hybrid Systems with Boost.Python 摘要(Abstract) 介绍(Introduction) 设计目标 (Boost.Python Design ...

  2. python学习笔记:安装boost python库以及使用boost.python库封装

    学习是一个累积的过程.在这个过程中,我们不仅要学习新的知识,还需要将以前学到的知识进行回顾总结. 前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数, C+ ...

  3. 【转】利用Boost.Python将C++代码封装为Python模块

    用Boost.Python将C++代码封装为Python模块 一.     基础篇 借助Boost.Python库可以将C/C++代码方便.快捷地移植到python模块当中,实现对python模块的扩 ...

  4. boost.python笔记

    boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...

  5. Boost.Python简介

    Boost.Python简单概括:是Boost库的一部分:用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针. 以下内容搬运自:https://wi ...

  6. 64位win7下安装Boost 1.59.0 + boost.python 1.59.0 + gccxml + pygccxml + pyplusplus(py++)

    由于安装过程中实在是出现了N多问题,所以不得不专门写个帖子来记录一下这破东西在Win7下的安装过程,避免以后还要再用的时候踩坑. 1.Boost简介 Boost库是一个可移植.提供源代码的C++库,作 ...

  7. boost.python入门教程 ----python 嵌入c++

    Python语言简介 Python是一种脚本语言.以开放的开发接口和独特的语法著称.尽管Python在国内引起注意只有几年的时间,但实际上Python出现于上世纪90年代(据www.python.or ...

  8. boost.python编译及演示样例

    欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/46781581 linux编译boost的链接:http://bl ...

  9. 【转】Boost.Python

    http://edyfox.codecarver.org/html/boost_python.html Boost.Python 是 Boost 中的一个组件,使用它能够大大简化用 C++ 为 Pyt ...

随机推荐

  1. C++回顾day03---<多态>

    一:错误理解下的多态 #include <iostream> using namespace std; class Parent { public: Parent() { cout < ...

  2. C#连接和操作Oracle数据

    最近业务需要读取远程Oracle数据库的数据,这里简单记录一下. 这里采用的是Oracle.ManagedDataAccess方式连接Oracle数据库,这种方式有几个优点:①不用安装Oracle客户 ...

  3. NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions

    .NET Core 控制台程序没有 ASP.NET Core 的 IWebHostBuilder 与 Startup.cs ,那要读 appsettings.json.注依赖.配日志.设 IOptio ...

  4. Angular记录(2)

    文档资料 箭头函数--MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_fun ...

  5. 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)

    一. 什么是事务 我们通俗的理解事务就是一系列操作要么全部成功.要么全部失败(不可能存在部分成功,部分失败的情况). 举一个事务在我们日常生活中的经典例子:两张银行卡(甲.乙),甲向乙转钱,整个过程需 ...

  6. [再寄小读者之数学篇](2014-06-22 函数恒为零的一个充分条件 [中国科学技术大学2011年高等数学B考研试题])

    设 $f(x)$ 在 $\bbR$ 上连续, 又 $$\bex \phi(x)=f(x)\int_0^x f(t)\rd t \eex$$ 单调递减. 证明: $f\equiv 0$. 证明: 设 $ ...

  7. [再寄小读者之数学篇](2014-04-18 from 352558840@qq.com [南开大学 2014 年高等代数考研试题]反对称矩阵的组合)

    (2014-04-18 from 352558840@qq.com [南开大学 2014 年高等代数考研试题]反对称矩阵的组合) 设 ${\bf A},{\bf B}$ 都是反对称矩阵, 且 ${\b ...

  8. [物理学与PDEs]第2章习题12 严格凸性的转换

    设 $L=L(\xi_0,\xi_1,\cdots,\xi_n)$ 关于变量 $\xi_0>0,\xi_1,\cdots,\xi_n$ 为严格凸的. 证明函数 $$\bex M=\cfrac{1 ...

  9. 【codeforces 765F】Souvenirs

    Description Artsem is on vacation and wants to buy souvenirs for his two teammates. There are n souv ...

  10. Django REST Framework API Guide 06

    本节大纲 1.Validators 2.Authentication Validators 在REST框架中处理验证的大多数时间,您将仅仅依赖于缺省字段验证,或在序列化器或字段类上编写显式验证方法.但 ...