使用Boost.Python

来源:互联网 发布:数据做预测的方法 编辑:程序博客网 时间:2024/05/22 14:02

 

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文件内容

 

 

 

 

2. 在C++中嵌入python

 

显然,在 C++中嵌入python不是为执行速度;也不是因为Python的语法简洁,如果是小段代码,那么直接用C++实现一遍也不难,如是项目需要,那为什么不一开始就用Python,何必这么麻烦。嵌入Python最主要的目的是利用现成的python代码。

在C++中执行Python可理解为“内建python解释器",这一部分需要用到Python/C API。

 

做嵌入开发,一个很重要的一点是Python内置类型与c++的互换。C中的所有Python对象都是PyObject对象,Python/C 提供了很多函数简化它们之间的转换。有兴趣可以参考这篇文章 http://www.cnblogs.com/lovemo1314/archive/2011/05/14/2046496.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)
 
所以比较麻烦的将可能是list, dict和tuple这几个在C++不是内置的类型。为了实现快速extend,BP用C++实现了一份与Python一致的类型,还包括long和str。正因为如此,可以在C++代码中仿照Python的写法(slice也有实现,但是很丑陋)。

 

3. 使用C++扩展Python

 

扩展的使用在test的目录下有非常多的示例,有需要时直接参考示例的做法。