您的位置:首页 > 编程语言 > C语言/C++

用boost封装C++的库供Python调用

2017-03-26 18:38 495 查看

用boost封装C++的库供Python调用

在网上查了一些教程,基本都是一些比较老的教程,在 boost 1.63.0 中无法使用,因此研读了boost的手册,一些笔记记录如下。

测试环境

OS:Windows10 x64

Python2.7 x64:Anaconda2 4.3.1

Boost 1.63.0 x64

dll工程配置

添加boost和Python头文件路径:“D:\boost_1_63_0\;D:\Anaconda2\include ”

添加boost和Python 链接器附加库目录: “D:\boost_1_63_0\lib64-msvc-14.0;D:\Anaconda2\libs ”

添加boost和Python 附加库文件:

python27.lib

libboost_atomic-vc140-mt-1_63.lib

libboost_atomic-vc140-mt-gd-1_63.lib

libboost_atomic-vc140-mt-s-1_63.lib

libboost_atomic-vc140-mt-sgd-1_63.lib

libboost_bzip2-vc140-mt-1_63.lib

libboost_bzip2-vc140-mt-gd-1_63.lib

libboost_bzip2-vc140-mt-s-1_63.lib

libboost_bzip2-vc140-mt-sgd-1_63.lib

libboost_bzip2-vc140-s-1_63.lib

libboost_bzip2-vc140-sgd-1_63.lib

libboost_chrono-vc140-mt-1_63.lib

libboost_chrono-vc140-mt-gd-1_63.lib

libboost_chrono-vc140-mt-s-1_63.lib

libboost_chrono-vc140-mt-sgd-1_63.lib

libboost_chrono-vc140-s-1_63.lib

libboost_chrono-vc140-sgd-1_63.lib

libboost_container-vc140-mt-1_63.lib

libboost_container-vc140-mt-gd-1_63.lib

libboost_container-vc140-mt-s-1_63.lib

libboost_container-vc140-mt-sgd-1_63.lib

libboost_container-vc140-s-1_63.lib

libboost_container-vc140-sgd-1_63.lib

libboost_context-vc140-mt-1_63.lib

libboost_context-vc140-mt-gd-1_63.lib

libboost_context-vc140-mt-s-1_63.lib

libboost_context-vc140-mt-sgd-1_63.lib

libboost_coroutine-vc140-mt-1_63.lib

libboost_coroutine-vc140-mt-gd-1_63.lib

libboost_coroutine-vc140-mt-s-1_63.lib

libboost_coroutine-vc140-mt-sgd-1_63.lib

libboost_coroutine-vc140-s-1_63.lib

libboost_coroutine-vc140-sgd-1_63.lib

libboost_date_time-vc140-mt-1_63.lib

libboost_date_time-vc140-mt-gd-1_63.lib

libboost_date_time-vc140-mt-s-1_63.lib

libboost_date_time-vc140-mt-sgd-1_63.lib

libboost_date_time-vc140-s-1_63.lib

libboost_date_time-vc140-sgd-1_63.lib

libboost_exception-vc140-mt-1_63.lib

libboost_exception-vc140-mt-gd-1_63.lib

libboost_exception-vc140-mt-s-1_63.lib

libboost_exception-vc140-mt-sgd-1_63.lib

libboost_exception-vc140-s-1_63.lib

libboost_exception-vc140-sgd-1_63.lib

libboost_fiber-vc140-mt-1_63.lib

libboost_fiber-vc140-mt-gd-1_63.lib

libboost_fiber-vc140-mt-s-1_63.lib

libboost_fiber-vc140-mt-sgd-1_63.lib

libboost_filesystem-vc140-mt-1_63.lib

libboost_filesystem-vc140-mt-gd-1_63.lib

libboost_filesystem-vc140-mt-s-1_63.lib

libboost_filesystem-vc140-mt-sgd-1_63.lib

libboost_filesystem-vc140-s-1_63.lib

libboost_filesystem-vc140-sgd-1_63.lib

libboost_graph-vc140-mt-1_63.lib

libboost_graph-vc140-mt-gd-1_63.lib

libboost_graph-vc140-mt-s-1_63.lib

libboost_graph-vc140-mt-sgd-1_63.lib

libboost_graph-vc140-s-1_63.lib

libboost_graph-vc140-sgd-1_63.lib

libboost_iostreams-vc140-mt-1_63.lib

libboost_iostreams-vc140-mt-gd-1_63.lib

libboost_iostreams-vc140-mt-s-1_63.lib

libboost_iostreams-vc140-mt-sgd-1_63.lib

libboost_iostreams-vc140-s-1_63.lib

libboost_iostreams-vc140-sgd-1_63.lib

libboost_locale-vc140-mt-1_63.lib

libboost_locale-vc140-mt-gd-1_63.lib

libboost_locale-vc140-mt-s-1_63.lib

libboost_locale-vc140-mt-sgd-1_63.lib

libboost_log-vc140-mt-1_63.lib

libboost_log-vc140-mt-gd-1_63.lib

libboost_log-vc140-mt-s-1_63.lib

libboost_log-vc140-mt-sgd-1_63.lib

libboost_log-vc140-s-1_63.lib

libboost_log-vc140-sgd-1_63.lib

libboost_log_setup-vc140-mt-1_63.lib

libboost_log_setup-vc140-mt-gd-1_63.lib

libboost_log_setup-vc140-mt-s-1_63.lib

libboost_log_setup-vc140-mt-sgd-1_63.lib

libboost_log_setup-vc140-s-1_63.lib

libboost_log_setup-vc140-sgd-1_63.lib

libboost_math_c99-vc140-mt-1_63.lib

libboost_math_c99-vc140-mt-gd-1_63.lib

libboost_math_c99-vc140-mt-s-1_63.lib

libboost_math_c99-vc140-mt-sgd-1_63.lib

libboost_math_c99-vc140-s-1_63.lib

libboost_math_c99-vc140-sgd-1_63.lib

libboost_math_c99f-vc140-mt-1_63.lib

libboost_math_c99f-vc140-mt-gd-1_63.lib

libboost_math_c99f-vc140-mt-s-1_63.lib

libboost_math_c99f-vc140-mt-sgd-1_63.lib

libboost_math_c99f-vc140-s-1_63.lib

libboost_math_c99f-vc140-sgd-1_63.lib

libboost_math_c99l-vc140-mt-1_63.lib

libboost_math_c99l-vc140-mt-gd-1_63.lib

libboost_math_c99l-vc140-mt-s-1_63.lib

libboost_math_c99l-vc140-mt-sgd-1_63.lib

libboost_math_c99l-vc140-s-1_63.lib

libboost_math_c99l-vc140-sgd-1_63.lib

libboost_math_tr1-vc140-mt-1_63.lib

libboost_math_tr1-vc140-mt-gd-1_63.lib

libboost_math_tr1-vc140-mt-s-1_63.lib

libboost_math_tr1-vc140-mt-sgd-1_63.lib

libboost_math_tr1-vc140-s-1_63.lib

libboost_math_tr1-vc140-sgd-1_63.lib

libboost_math_tr1f-vc140-mt-1_63.lib

libboost_math_tr1f-vc140-mt-gd-1_63.lib

libboost_math_tr1f-vc140-mt-s-1_63.lib

libboost_math_tr1f-vc140-mt-sgd-1_63.lib

libboost_math_tr1f-vc140-s-1_63.lib

libboost_math_tr1f-vc140-sgd-1_63.lib

libboost_math_tr1l-vc140-mt-1_63.lib

libboost_math_tr1l-vc140-mt-gd-1_63.lib

libboost_math_tr1l-vc140-mt-s-1_63.lib

libboost_math_tr1l-vc140-mt-sgd-1_63.lib

libboost_math_tr1l-vc140-s-1_63.lib

libboost_math_tr1l-vc140-sgd-1_63.lib

libboost_prg_exec_monitor-vc140-mt-1_63.lib

libboost_prg_exec_monitor-vc140-mt-gd-1_63.lib

libboost_prg_exec_monitor-vc140-mt-s-1_63.lib

libboost_prg_exec_monitor-vc140-mt-sgd-1_63.lib

libboost_prg_exec_monitor-vc140-s-1_63.lib

libboost_prg_exec_monitor-vc140-sgd-1_63.lib

libboost_program_options-vc140-mt-1_63.lib

libboost_program_options-vc140-mt-gd-1_63.lib

libboost_program_options-vc140-mt-s-1_63.lib

libboost_program_options-vc140-mt-sgd-1_63.lib

libboost_program_options-vc140-s-1_63.lib

libboost_program_options-vc140-sgd-1_63.lib

libboost_python-vc140-mt-1_63.lib

libboost_python-vc140-mt-gd-1_63.lib

libboost_python-vc140-mt-s-1_63.lib

libboost_python-vc140-mt-sgd-1_63.lib

libboost_python-vc140-s-1_63.lib

libboost_python-vc140-sgd-1_63.lib

libboost_random-vc140-mt-1_63.lib

libboost_random-vc140-mt-gd-1_63.lib

libboost_random-vc140-mt-s-1_63.lib

libboost_random-vc140-mt-sgd-1_63.lib

libboost_random-vc140-s-1_63.lib

libboost_random-vc140-sgd-1_63.lib

libboost_regex-vc140-mt-1_63.lib

libboost_regex-vc140-mt-gd-1_63.lib

libboost_regex-vc140-mt-s-1_63.lib

libboost_regex-vc140-mt-sgd-1_63.lib

libboost_regex-vc140-s-1_63.lib

libboost_regex-vc140-sgd-1_63.lib

libboost_serialization-vc140-mt-1_63.lib

libboost_serialization-vc140-mt-gd-1_63.lib

libboost_serialization-vc140-mt-s-1_63.lib

libboost_serialization-vc140-mt-sgd-1_63.lib

libboost_serialization-vc140-s-1_63.lib

libboost_serialization-vc140-sgd-1_63.lib

libboost_signals-vc140-mt-1_63.lib

libboost_signals-vc140-mt-gd-1_63.lib

libboost_signals-vc140-mt-s-1_63.lib

libboost_signals-vc140-mt-sgd-1_63.lib

libboost_signals-vc140-s-1_63.lib

libboost_signals-vc140-sgd-1_63.lib

libboost_system-vc140-mt-1_63.lib

libboost_system-vc140-mt-gd-1_63.lib

libboost_system-vc140-mt-s-1_63.lib

l
4000
ibboost_system-vc140-mt-sgd-1_63.lib

libboost_system-vc140-s-1_63.lib

libboost_system-vc140-sgd-1_63.lib

libboost_test_exec_monitor-vc140-mt-1_63.lib

libboost_test_exec_monitor-vc140-mt-gd-1_63.lib

libboost_test_exec_monitor-vc140-mt-s-1_63.lib

libboost_test_exec_monitor-vc140-mt-sgd-1_63.lib

libboost_test_exec_monitor-vc140-s-1_63.lib

libboost_test_exec_monitor-vc140-sgd-1_63.lib

libboost_thread-vc140-mt-1_63.lib

libboost_thread-vc140-mt-gd-1_63.lib

libboost_thread-vc140-mt-s-1_63.lib

libboost_thread-vc140-mt-sgd-1_63.lib

libboost_timer-vc140-mt-1_63.lib

libboost_timer-vc140-mt-gd-1_63.lib

libboost_timer-vc140-mt-s-1_63.lib

libboost_timer-vc140-mt-sgd-1_63.lib

libboost_timer-vc140-s-1_63.lib

libboost_timer-vc140-sgd-1_63.lib

libboost_type_erasure-vc140-mt-1_63.lib

libboost_type_erasure-vc140-mt-gd-1_63.lib

libboost_type_erasure-vc140-mt-s-1_63.lib

libboost_type_erasure-vc140-mt-sgd-1_63.lib

libboost_type_erasure-vc140-s-1_63.lib

libboost_type_erasure-vc140-sgd-1_63.lib

libboost_unit_test_framework-vc140-mt-1_63.lib

libboost_unit_test_framework-vc140-mt-gd-1_63.lib

libboost_unit_test_framework-vc140-mt-s-1_63.lib

libboost_unit_test_framework-vc140-mt-sgd-1_63.lib

libboost_unit_test_framework-vc140-s-1_63.lib

libboost_unit_test_framework-vc140-sgd-1_63.lib

libboost_wave-vc140-mt-1_63.lib

libboost_wave-vc140-mt-gd-1_63.lib

libboost_wave-vc140-mt-s-1_63.lib

libboost_wave-vc140-mt-sgd-1_63.lib

libboost_wserialization-vc140-mt-1_63.lib

libboost_wserialization-vc140-mt-gd-1_63.lib

libboost_wserialization-vc140-mt-s-1_63.lib

libboost_wserialization-vc140-mt-sgd-1_63.lib

libboost_wserialization-vc140-s-1_63.lib

libboost_wserialization-vc140-sgd-1_63.lib

libboost_zlib-vc140-mt-1_63.lib

libboost_zlib-vc140-mt-gd-1_63.lib

libboost_zlib-vc140-mt-s-1_63.lib

libboost_zlib-vc140-mt-sgd-1_63.lib

libboost_zlib-vc140-s-1_63.lib

libboost_zlib-vc140-sgd-1_63.lib

C++ demo源代码

// helloBoostPython.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"

// 头文件引用
#include <boost/python.hpp>

/*******************************1、简单函数********************************/
char const* greet(){
return "hello, world";
}

/*******************************2、简单类**********************************/
struct World{
World(std::string msg) : msg(msg) {} // added constructor
void setstr(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;

std::string const name;
float value;
float get() { return this->value; }
void set(float value) { this->value = value; }
};

/******************************3、继承和派生********************************/
struct Base { virtual ~Base() { ; } };
struct Derived : Base {};//继承于Base
void b(Base*);
void d(Derived*);
Base* factory() { return new Derived; }

/*******************************4、运算符重载********************************/
class FilePos { /*...*/ };
FilePos     operator+(FilePos, int) {}
FilePos     operator+(int, FilePos) {}
int         operator-(FilePos, FilePos) {}
FilePos     operator-(FilePos, int) {}
FilePos&    operator+=(FilePos&, int) {}
FilePos&    operator-=(FilePos&, int) {}
bool        operator<(FilePos, FilePos) {}

/****************************把C++程序封装为Python可调用的程序***************/
BOOST_PYTHON_MODULE(helloBoostPython){
using namespace boost::python;

/*******************************1、简单函数********************************/
def("greet", greet);

/*******************************2、简单类**********************************/
class_<World>("World", init<std::string>())//init构造函数
.def("greet", &World::greet)//不带参数的方法
.def("setstr", &World::setstr)//带参数的方法
.def_readonly("name", &World::name)//只读成员变量
.def_readwrite("value", &World::value)//可读写成员变量
.add_property("readonlyvalue", &World::get)//给Python中的类添加只读属性
.add_property("value", &World::get, &World::set);//给Python中的类添加读写属性

/******************************3、继承和派生********************************/
//基类
class_<Base>("Base");
//继承的类
class_<Derived, bases<Base> >("Derived");
//关于继承的类的函数
def("b", b);//基类指针作为参数的函数
def("d", d);//派生指针作为参数的函数
def("factory", factory);//返回值为派生类指针的函数

/*******************************4、运算符重载********************************/
class_<FilePos>("FilePos")
.def(self + int())          // __add__
.def(int() + self)          // __radd__
.def(self - self)           // __sub__
.def(self - int())          // __sub__
.def(self += int())         // __iadd__
.def(self -= other<int>())
.def(self < self);          // __lt__
}


生成和调用

生成工程,将生成的目标文件 “helloBoostPython.dll ”修改为 “helloBoostPython.pyd ”

新建 hello.py ,测试代码

# -*- coding:utf-8 -*-
import helloBoostPython

# 简单函数
print helloBoostPython.greet()

# 简单类
planet = helloBoostPython.World("xm")
print planet.greet()

# 略...


更多用法参考boost docs
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python boost c++