今天需要在python里调用一个c++函数,因此各种查资料,发现boost.python库的使用还是很简单的。在这总结一下,以供大家参考。
给大家几个链接,在这里提醒大家,很多资料由于时间久远,可能boost的版本比较低,较高版本的boost里的函数用法可能已经发生了变化,大家要注意,如果有什么问题,大家多多问问百度,谷歌。
第一篇博客的特点是,讲了简单的环境搭建。http://www.cnblogs.com/gaoxing/p/4317051.html
第二篇博客的特点是,总结了几个需要注意的问题,针对的是分装C++子函数。http://www.tuicool.com/articles/3ErQvem
第三篇博客的特点是,讲述了Python和C++的互调,但是我感觉博主用的版本有点老了,我没有使用里面的几个函数,也成功了。http://blog.csdn.net/begtostudy/article/details/5684972
第四篇博客的特点是,博主总结了python调用C/C++的方法。http://blog.csdn.net/fxjtoday/article/details/6059874
第五篇博客的特点是,这篇博客针对的类及类成员的封装。http://blog.csdn.net/scuhank/article/details/7769342
第六篇博客的特点是,这篇博客针对的是指针参数和引用参数的介绍。http://www.cppblog.com/chinloon/archive/2011/09/20/156313.html
第七篇博客的特点是,这对一个类的封装,讲的很详细。http://blog.csdn.net/majianfei1023/article/details/46781581
第八篇博客的特点是,讲述了对各种函数的封装,尤其是重载函数。http://www.cnblogs.com/qqxinbao/p/3213422.html
再给大家一个boost官方的例子,但是要注意返回类型,和参数类型:
<span style="font-size:18px;">#include <boost/python/def.hpp>
#include <boost/python/module.hpp>
#include <boost/python/args.hpp>
using namespace boost::python;
char const* foo(int x, int y) { return "foo"; }
BOOST_PYTHON_MODULE(def_test)
{
def("foo", foo, args("x", "y"), "foo's docstring");
}</span>
好了,下面说我自己的了。我基本上是按照第二篇博客做的,但是也做了一些改动。
首先,简单的配置,一定要修改这两个地方。
然后,如果出现“pyconfig.h” No find the file 那是因为没有添加Python的头文件。如果提示没有找到python27.lib,添加就可以了。
double sharpness(string image_path){
....... ....... .......
return P;
}
BOOST_PYTHON_MODULE(sharpness)
{
def("detection", sharpness, args("image_path"),"help message");
}
下面重点介绍下def()函数里参数的意义。
第一:BOOST_PYTHON_MODULE(model_name)
*BOOST_PYTHON_MODULE 并不是写在主函数里。
这里的model_name 是你的py模块名字,注意这里的model_name必须和你的源文件(也就是*****.cpp)名字一样你的工程名字一样,当你的工程项目名称和你的***.cpp名字不一样时,需要特别注意。
第二:参数1 “detection”
1)记得使用引号呦
2)这里的detection是模块中子函数的名字,这个可以根据自己喜好自己定
第三:参数2 sharpness
这是你要封装的C++函数的名称
第四:参数3 args
1)记得使用引号呦
2)这里是C++函数的形参名字,可参照官方例子
第五:最后一个参数没弄明白什么意思。
一起,做好后,点击生成就可以了。这样你就会得到一个.pyd的文件,这相当于python的dll。把.pyd文件与你的.py文件放在一起,就可以直接导入使用了。
在这里指明一个问题,很多博客说到:
<span style="font-size:18px;">/由于我的返回值给的是char*,不是const char*,所以必须要对返回值策略进行说明,否则编译不过去
//这也是我碰到的第一个问题
boost::python::def("greet", greet, boost::python::return_value_policy<boost::python::return_opaque_pointer>()); </span>
但是我的子函数返回值是double,使用
<span style="font-size:18px;">boost::python::return_value_policy<boost::python::return_opaque_pointer>()</span>
参数后,反而一直报错,去掉后正确了。以后还需研究呀。