利用boost.python封装C++函数供python调用

44 篇文章 0 订阅
5 篇文章 0 订阅

今天需要在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>
参数后,反而一直报错,去掉后正确了。以后还需研究呀。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值