利用boost.python封装C++函数供python调用
利用Boost.Python封装C++函数需注意环境配置,添加Python头文件与库路径;模块名须与工程名一致;def()函数定义子函数名、C++函数名及参数名;生成.pyd文件后即可在Python中导入。返回double类型无需指定返回值策略。
今天需要在Python里调用一个C++函数,折腾了一圈,发现Boost.Python用起来其实比想象中简单。这里把过程整理一下,给有类似需求的朋友做个参考。
先提个醒:网上很多资料年代比较久了,Boost版本低,高版本的API可能已经变了。如果遇到问题,多查查官方文档或者最新博客,别死磕老代码。
下面直接说实操。我主要是参考了一篇讲封装C++子函数注意点的文章,但自己做了些调整。先搞定环境配置——这一步最基础也最容易踩坑。

配置时一定要修改这两处。如果编译时提示“pyconfig.h”找不到,那是没添加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)
这个宏并不是写在主函数里的。model_name是你的Python模块名字,必须和工程名称一致——注意,是工程名称,不是你那个.cpp文件名。如果工程名和.cpp文件名不同,很容易在这里翻车。
第二:参数1 "detection"
记得加引号。这个名称是Python模块中子函数的名字,可以按自己喜好定义。
第三:参数2 sharpness
这是你要封装的C++函数名,原封不动写进去。
第四:参数3 args
也要加引号。这里是C++函数的形参名字,参考官方例子写就行。
第五:最后一个参数
目前还没完全搞懂具体作用,有知道的朋友欢迎补充。
全部配置好后,直接生成。你会得到一个.pyd文件,这相当于Python的dll。把.pyd文件和你的.py文件放在一起,import就能用了。
有一点需要说明:很多博客提到,如果C++函数返回的是char*而非const char*,必须指定返回值策略,比如return_value_policy。但我自己封装的函数返回值是double,用了这个策略反而一直报错,去掉之后一切正常。看来不同类型处理方式确实不一样,以后有空再深究吧。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















