python做算法 不会c++如何将代码封装给别人调用_实战经验:借助boost实现Python调用C++代码...

我们很喜欢Python的简单易用,也喜欢性能强劲的C++。在这种情况下,就有了混合编程的需求。对性能敏感的地方,我们可以采用C++来编写,其他的地方,比如业务逻辑,用户界面这些,Python就可能更合适。今天我们就来讲讲如何在Python中调用C++代码。本方法主要使用boost库中的Python组件来对C++库代码进行封装,从而实现在Python环境下调用C++的功能。

安装boost库

# yum install boost

安装Python开发库

# yum install python-devel

创建C++库

编制一个简单的C++库,文件名为helloworld.cpp,文件内容如下:

#include

void test()

{

printf("hello, world\n");

}

创建Python封装库

再编制一个用于Python调用的封装库,文件名为helloworldpy.cpp,文件内容如下:

#include

#include "helloworld.cpp"

using namespace boost::python;

BOOST_PYTHON_MODULE(helloworld)

{

def("test", test);

}

注意,这里的helloworld为封装库的名字,def中第一个参数为Python面对的外部接口函数名字,后面第二个参数为实际调用的C++函数名字。

另外,文件开头包含的是C++库的实现代码,即上面的helloworld.cpp。

编译生成封装库

g++ helloworldpy.cpp -fPIC -shared -I/usr/include/python2.7 -lboost_python -o helloworld.so

注意,这里仅编译helloworldpy.cpp,不需要在编译helloworld.cpp文件了,否则会出现test函数重复定义的问题。

另外-fPIC和-shard一起使用,可以生成一个Linux共享库,而不是静态库。

这里的-I/usr/include/python2.7表示Python的头文件路径,需要安装Python的实际安装位置修改。

-lboost_python表示需要链接到boost_python库。

最后,-o helloworld.so指定最终生成的封装库的名字为helloworld.so。

执行效果

在生成的so文件同一目录下,我们在Shell中打开Python,首先import我们的封装库,然后调用外部接口函数,即可完成Python环境下调用我们编写的C++代码了。如下图所示:

python做算法 不会c++如何将代码封装给别人调用_实战经验:借助boost实现Python调用C++代码..._第1张图片

碰到的问题

1)如果编译封装库的时候,出现了如下的问题:

In file included from /usr/include/boost/python/detail/prefix.hpp:13:0,

from /usr/include/boost/python/args.hpp:8,

from /usr/include/boost/python.hpp:11,

from helloworld.cpp:2:

/usr/include/boost/python/detail/wrap_python.hpp:50:23: fatal error: pyconfig.h: No such file or directory

# include ^

compilation terminated.

这是因为当前环境下没有安装的Python的开发库,使用yum安装一下即可。

# yum install python-devel

你可能感兴趣的:(python做算法)