python语言的优良性就不多说了,我想提下如何使用boost.python,通过boost.python既可以将python转移到C++上,通过Python库,也可以通过C++来扩展python,下面主要介绍使用boost.python来扩展python的功能,第一次用boost.python,倒腾了半天才搞定:

首先列出我的测试环境:

我用的是VS2010,python2.7,我用VS2010创建了一个windows DLL的项目,项目名称为pylib,在DLL main中加入如下代码:


//如果返回的不是const char*
 //则需要在python函数对象定义的地方加上
 //boost::python::return_value_policy<boost::python::return_opaque_pointer>()
 //指明返回值的类型


 char* greet()
 {
return "hi extending python!";
 }
 BOOST_PYTHON_MODULE(greet_ext)
 {

//由于我的返回值给的是char*,不是const char*,所以必须要对返回值策略进行说明,否则编译不过去

//这也是我碰到的第一个问题
boost::python::def("greet", greet, boost::python::return_value_policy<boost::python::return_opaque_pointer>());
}


然后我在编译好的release目录下创建了一个测试的py文件,用来测试脚本文件是否能正确加载,我的py脚本文件如下:

import pylib
 print pylib.greet2()

运行python程序报DLL Load Failed,说明动态库加载失败,我查了一下原来是boost.python的动态库忘了放到编译执行目录下了。于是我从boost的编译目录下将

boost_python-vc100-mt-1_55.dll文件拷贝过来了,嘿嘿!果然不报这个错误了。但是让我吃惊的是又有一个问题来了,说找不到initpylib函数:(中间我各种折腾

的过程就不细说了),最终将问题锁定到模块的名称上,因为python是将文件名称作为模块名称,所以在到处的时候也必须如此,也就是说你最终编译生成的pyd文件

(其实就是动态库文件,只不过改成python能认识的后缀而已)的名称必须和你导出模块的名称保持一直,否则python认为该模块不能正确的进行加载。所以我把

BOOST_PYTHON_MODULE(greet_ext)

改成pyd的文件名称pylib:

BOOST_PYTHON_MODULE(pylib)

于是重新执行python的测试程序,OK,结果正确显示:

下面我简单的总结一下boost.python在使用过程中需要注意的问题:

1.动态库编译输出成*.pyd格式

2.保证该动态库所依赖的动态库python都可以找得到,最简单的就是将他们都放在一起就行。

3.保证BOOST_PYTHON_MODULE(模块名称) 指定的模块名称和动态库的文件名称保持一致

4.其他关于类等高级用法参考boost.python。