用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
libboost_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