用Boost.Python将C++代码封装为Python模块
一. 基础篇
借助Boost.Python库可以将C/C++代码方便、快捷地移植到python模块当中,实现对python模块的扩充。首先,将C++下的代码编译为动态库,并将生成的动态库命名为封装模块的名字,如:用BOOST_PYTHON_MODULE(Module_Name)宏对需要导出的函数、全局变量、类等导入Python的Module_Name模块,此时生成的动态库需要更名为Module_Name.pyd。然后,将Module_Name.pyd放在python的系统搜索目录中(通常是%PYTHON_PATH%\DLLs目录)。最后,在IDLE GUI界面或是python脚本中执行import Module_Name,这样就可以在python复用C++中定义的函数、类等而不必重写。
二. 实例篇
下面的实例代码主要针对抽象类、带默认实现虚函数的类、类的成员函数及操作符重载、带默认参数的函数(包括构造函数)、派生类、纯虚函数、返回对象及字符串的函数等的封装方法,基本概括了C+扩展到python模块的常见类型。
//boostpython_abs.h
#ifndefBOOSTPYTHON_ABS_H
#define BOOSTPYTHON_ABS_H
/*
*brief:
* wrap c/c++ code as dll and export the class/function interfaces
* to python as modules with boost-library
*author:
* hank
*history:
* created 2012-07-13
*/
#ifndef BSTPABS_API
#define BSTPABS_API __declspec(dllimport)
#else
#define BSTPABS_API __declspec(dllexport)
#endif
/*
* 1.export the abstract class into python module
* 2.abstract class with member over-load functions|operators
*/
class BSTPABS_API CPhone
{
public:
enum Mode{ CANCONNET = 0, CONNECTED, PAUSE, DISCONNECTED };
public:
CPhone(std::string owner = "" ){}
virtual int make_call( int phone_num ) = 0;
virtual std::string make_call( std::string name ) = 0;
virtual CPhone& operator << ( int phone_num ) = 0;
virtual CPhone& operator << ( std::string name ) = 0;
};
#endif//BOOSTPYTHON_ABS_H
//boostpython_abs.cpp
#include <boost/python.hpp>
#include "boostpython_abs.h"
//here,wrap the CPhone class
class CPhoneWrap :public CPhone,
public boost::python::wrapper<CPhone>
{
public:
int make_call( int phone_num );
std::string make_call( std::string name );
CPhone& operator <<( int phone_num );
CPhone& operator << ( std::string name );
};
//define function pointers of overload functions