实战经验:借助boost实现Python调用C++代码

实战经验:借助boost实现Python调用C++代码

作者:BlogUpdater |  时间:2018-04-17 |  浏览:4207 |  评论已关闭 条评论

我们很喜欢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 <stdio.h>

void test()
{
        printf("hello, world\n");
}

 

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

#include <boost/python.hpp>
#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++代码了。如下图所示:

 

碰到的问题

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

标签:

评论已关闭。