-Boost.Python的简明入门指南
Boost.Python 是 Boost 中的一个组件, 使用它能够大大简化用 C++ 为 Python 写扩展库的步骤,提高开发效率,为两种语言的混和编程提供了极大方便。
编译Boost.Python可以根据Boost库的编译指南,编译整个Boost库,然后相应安装,其中包括Python库的安装。这里介绍只编译Boost库。
1. 设置环境变量,其中python_install_path表示python的安装目录,boost_src表示boost源文件所在目录。
a) 在include中添加$(python_install_path)/ include;$(boost_src)
b) 在lib中添加$(python_install_path)/ libs;$(boost_src)
2. 使用$(boost_src)/libs/python/build/VisualStudio下的工程文件。
3. 选择相应的工程进行编译。
4. 建立Boost库的使用路径boost_install,拷贝boost的头文件到$(boost_install)/include目录下,拷贝编译的lib和dll文件到$(boost_install)/lib目录下。
5. 添加环境变量。
a) 在include中增加$(boost_install)/include
b) 在path中增加(boost_install)/lib
1. 首先切换到 Boost 源码所在的路径, 执行 ./configure 脚本,为配置脚本提供 Python 运行环境相应的参数:
./configure --with-python=/usr/bin/python /
--with-python-version=2.4 /
--with-python-root=/usr
2. 然后, 和绝大部分 Linux 程序一样, 执行 make 就可以开始编译了。编译完毕后, 切换到 root 权限后再执行 make install,把 Boost 相应的头文件和库文件复制到相应的地方, 就可以使用了。
1. 首先需要编译的是 Boost 的编译工具 bjam, 直接到 bjam 所在目录下, 即 Boost 源码包所在目录下的 /tools/build/jam_src, 执行 build.bat mingw,稍等片刻, bjam.exe 就编译好了。 把编译好的 bjam.exe 复制到你的 %PATH% 路径能够直接找到的地方, 为后续的编译工作做好准备。
2. 换到 Boost 源码所在路径, 执行 bjam 进行编译。 我们需要提供关于 Python 的一些参数, 变量 PYTHON_ROOT 指向 Python 运行环境所在的目录,变量 PYTHON_VERSION 的值为 Python 的版本号, 如果你的 Python 安装路径与滇狐不同,请将相应的变量修改为你机器上相应的路径, 编译命令行如下:
bjam.exe
"-sTOOLS=mingw" "-sPYTHON_ROOT=E:/Python" "-sPYTHON_VERSION=2.4"
编译和设置工作到此为止。下面是一个使用Boost.Python为Python提供接口的一个实例。
本节使用Boost.Python写一个Hello world实例来说明简单的使用。
All: simple_class.o
link simple_class.o /OUT:"simple_class.dll" /DLL /LIBPATH:"H:/Python24/libs" /LIBPATH:"C:/Boost/lib" python24.lib boost_python.lib
simple_class.o :
cl -c -EHsc -LD -Fosimple_class.o -I"C:/Boost/include/boost-1_33_1" -I"H:/Python24/include" HelloPthon.cpp
clean:
rm -f *.lib *.o *.dll
需要注意的是,编译的动态链接库文件名字需要和定义Python接口的Module名称相同。
编译完成后就可以通过python使用C++的库了。
Import simple_class //导入相关模块
bs = simple_class.hello("Huoyw") //生成相关对象
bs.greet() //调用相关函数
/* hello.cpp */
#include
using namespace boost::python;
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello)
{
def("greet", greet);
}
见章节Hello Python
/*container.cpp*/
#include
#include
#include
using namespace boost::python;
typedef std::vector
BOOST_PYTHON_MODULE(container)
{
class_
.def( vector_indexing_suite< std::vector
class_
.def( vector_indexing_suite< std::vector
}
/*args.cpp*/
#include
#include
#include
using namespace boost::python;
void ShowPerson(std::string name, int age=30, std::string nationality="Chinese")
{
std::cout<
}
// 1是最少参数个数,3是最大参数个数
BOOST_PYTHON_FUNCTION_OVERLOADS(ShowPerson_overloads, ShowPerson, 1, 3)
BOOST_PYTHON_MODULE(args)
{
def("ShowPerson", ShowPerson, ShowPerson_overloads());
}
语言的混和编程是一个值得深入探讨的问题,每种编程语言都有应用的特定应用环境,和各自的优点。Python和C++有一脉相承的地方也有很多互补的地方。Boost库和C++ 0X的标准在C ++对python的扩展方面做了很多工作,Boost.Python是很重要的一个产物。除了为Python提供接口以外,Boost.Python在程序互相调用方面也提供了很好的支持。