利用boost将C++程序生成动态链接库供Python程序调用
C++的运行效率要比Python高许多,本文实现使用C++编写Python扩展
环境:Python3,Ubuntu16.04;简单实现一个求最大公约数的类;生成的是so文件,仅供Linux系统使用
1.准备
(1)安装相关依赖
sudo apt-get install libboost-all-dev
sudo apt-get install python-dev
(2)相关文件
在同级目录下建立三个文件:GCD.cpp
,Makefile
,Untitle.ipynb
2. 编写C++代码
#include <boost/python.hpp>
#include <iostream>
#include <string>
using namespace boost::python;\\注意命名空间
class GCD
{
private:
std::string name;
public:
int gcd(int a,int b); \\声明成员函数
GCD(const std::string s);
std::string introduce();
};
GCD::GCD(const std::string s) \\此函数封装之后相当于Python中的init()
{
this->name = s; \\简单实现为私有变量赋值功能
}
int GCD::gcd(int a,int b) \\计算最大公约数
{
{
int t;
t=a%b;
if(t==0)
{
return b;
}
else
{
return gcd(b,t);
}
}
}
std::string GCD::introduce() \\调用私有变量
{
std::string myname = this->name;
return "my name is "+myname;
}
//主要加入以下代码,将C++类封装为Python模块
BOOST_PYTHON_MODULE(GCD) //so文件名
{
class_<GCD>("GCD", init<const std::string>()) // 尖括号里的为C++类名,双引号里为函数名,init里面就是放构造函数的参数
.def("introduce",&GCD::introduce)
.def("gcd", &GCD::gcd); //导出类中的方法
//def("only4test",&only4test); //普通函数导出
}
3. 编译
(1)编写Makefile
CC = g++
CFLAG = -fPIC -std=c++11 -I. -I/usr/include/python3.5m #这里的路径和下面一行根据自己的情况
LIBS = -lboost_python-py35 -lpython3.5m
TARGET = GCD.so #目标文件(.so文件)
SRC = GCD.cpp #源文件(待编译的.cpp文件)
$(TARGET): $(SRC)
$(CC) -shared -o $@ $^ $(CFLAG) $(LIBS) #前面为Tab,不能用空格
(2)编译
终端键入
make
即可生成os文件
4.测试
打开jupyter notebook,测试以下代码
import GCD
test = GCD.GCD("test0")
info = test.introduce()
print(info)
res = test.gcd(27,45)
print(res)
结果如图: