您的位置:首页 > 编程语言 > Python开发

使用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的目录下有非常多的示例,有需要时直接参考示例的做法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: