使用Boost.Python
2011-06-16 19:03
183 查看
1. 在Windows下配置Boost.Python
Boost.Python是少数几个需要编译的Boost库,并且要求机器上已经装有python。编译的方法也非常简单,只需要在Boost目录下执行bjam -toolset=msvc --with-python
编译好后就可以测试效果了。这里我使用$Boost/libs/python/example/quickstart的embedding.cpp做测试。最开始使用官方文档中提供的bjam方法
bjam toolset=msvc --verbose-test test
连接不成功。无奈使用VS2008来编译。
新建console工程,添加embedding.cpp,接着加入boost与python的include和libs路径。需要注意的是,boost的libs不是在$Boost/stage/lib那里,而是在$Boost/bin.v2/libs/python/build/msvc-9.0/debug/threading-multi。一切搞定好后,应该编译可以通过了。extending的工程也类似,只是要注意的是需要把extending.dll改名为extending.pyd。PS: *nix下直接.so就可以了,Mac用户需要把dylib改过来。
有时编译出来的没有dll文件,可以尝试在bjam中再添加一个参数 ‘link=shared’。
我使用scons来构建,下面是SConstruct文件内容
env = Environment(CPPPATH=['d:/tools/Python26/include', 'd:/Program Files/boost_1_40_0'], LIBPATH=['d:/Program Files/boost_1_40_0/stage/lib', 'd:/tools/Python26/libs'], CPPFLAGS=["/MDd", "/EHsc"]) env.Program('embedding.cpp') env.SharedLibrary('extending.cpp') Command("extending.pyd", "extending.dll", [Copy('extending.pyd', 'extending.dll'), Delete('extending.dll')])
2. 在C++中嵌入python
显然,在 C++中嵌入python不是为执行速度;也不是因为Python的语法简洁,如果是小段代码,那么直接用C++实现一遍也不难,如是项目需要,那为什么不一开始就用Python,何必这么麻烦。嵌入Python最主要的目的是利用现成的python代码。在C++中执行Python可理解为“内建python解释器",这一部分需要用到Python/C API。
做嵌入开发,一个很重要的一点是Python内置类型与c++的互换。C中的所有Python对象都是PyObject对象,Python/C 提供了很多函数简化它们之间的转换。有兴趣可以参考这篇文章 /article/6540362.html
BP在它的基础上做了一层封装,但是从表面看来这方面做得并不好(BP更倾向于extend而非embed)。不过我在文档上找不到它对整数、字符串、list是怎么处理的,只是隐约地看到下面类似的代码:
BOOST_TEST(python::extract<int>(global["number"]) == 42);
boost::python命名空间下定义了所有内置类型,它同样是object对象。在object_core找到它的定义。objcet构造函数接受一个类型参数,用于将此值转换为PyObject,并自动管理引用计数。
实际应用中,大部份情况都是通过exec系列调用的。在传入参数时,不用费劲地把这些内置类型转换为PyObject,BP的基本上已经实现了(TypeWarpper)
// Retrieve the main module's namespace python::object global; // Define the derived class in Python. python::object result = python::exec( "def hpp(a): /n" " return a+1 /n" , global, global); python::object hpp = global["hpp"]; std::cout << ">>>> !" << python::extract<int>(hpp(12)) << std::endl;
所以比较麻烦的将可能是list, dict和tuple这几个在C++不是内置的类型。为了实现快速extend,BP用C++实现了一份与Python一致的类型,还包括long和str。正因为如此,可以在C++代码中仿照Python的写法(slice也有实现,但是很丑陋)。
3. 使用C++扩展Python
扩展的使用在test的目录下有非常多的示例,有需要时直接参考示例的做法。相关文章推荐
- 使用Python WSGI编写Web服务器前端,并利用Boost.Python在同一进程内连接到C++服务后端实现
- boost python的使用
- boost_Python 安装和使用
- 【Python学习】python不要使用任何模块名作为文件名(module 'xgboost' has no attribute 'DMatrix')
- python+xgboost在windows上的安装和使用
- windows在python安装使用xgboost走了些弯路
- Python学习:mac下使用boost.bython扩充python
- suse 11下编译使用boost-python报错:error: changes meaning of 'keywords' from 'struct boost::python::detail::keywords'
- python包xgboost安装和简单使用
- python 使用Boost.python 调用c++
- C++使用boost python开发后发布程序需要注意的几点
- windows(64位)下用GPU版本的mxnet配置(绑定python)+xgboost快速安装使用
- Boost Python中exec,eval, exec_file, extract<>的函数形式和使用方法
- machine learning in coding(python):使用xgboost构建预测模型
- 使用boost.python静态库
- boost.python 使用时注意小事项
- XGBoost原理及在Python中使用XGBoost
- 使用boost实现python调用c++
- 使用boost::python的链接出错
- 让主程序可以通过python脚本扩展功能及boost.python的使用