⽤C++为python写扩展库
⽤C++为python写扩展库
-Boost.Python的简明⼊门指南
Boost.Python 是 Boost 中的⼀个组件,使⽤它能够⼤⼤简化⽤ C++ 为 Python 写扩展库的步骤,提⾼开发效率,为两种语⾔的混和编程提供了极⼤⽅便。
编译Boost.Python
编译Boost.Python可以根据Boost库的编译指南,编译整个Boost库,然后相应安装,其中包括Python库的安装。这⾥介绍只编
译Boost库。
编译⼀Windows + VC 6
.设置环境变量,其中python_install_path表⽰python的安装⽬录,boost_src表⽰boost源⽂件所在⽬录。
)
在include中添加$(python_install_path)/ include;$(boost_src)
)在lib中添加$(python_install_path)/ libs;$(boost_src)
.使⽤$(boost_src)/libs/python/build/VisualStudio下的⼯程⽂件。
.选择相应的⼯程进⾏编译。
.建⽴Boost库的使⽤路径boost_install,拷贝boost的头⽂件到$(boost_install)/include⽬录下,拷贝编译的lib和dll⽂件到$(boost_install)/lib⽬录下。
.添加环境变量。
)在include中增加$(boost_install)/include
)在path中增加(boost_install)/lib
编译⼆ Linux 下的编译
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 相
应的头⽂件和库⽂件复制到相应的地⽅,就可以使⽤了。
编译三Windows +MinGW
.⾸先需要编译的是 Boost 的编译⼯具 bjam,直接到 bjam 所在⽬录下,即 Boost 源码包所在⽬录下的 /tools/build/jam_src,执⾏build.bat mingw,稍等⽚刻, 就编译好了。把编译好的 复制到你的 %PATH% 路径能够直接到的地⽅,为后续的编译⼯作做好准备。
.换到 Boost 源码所在路径,执⾏ bjam 进⾏编译。我们需要提供关于 Python 的⼀些参数,变量 PYTHON_ROOT 指向 Python 运⾏环境所在的⽬录,变量 PYTHON_VERSION 的值为 Python 的版本号,如果你的 Python 安装路径与滇狐不同,请将相应的变量修改为你机器上相应的路径,编译命令⾏如下:
<
"-sTOOLS=mingw" "-sPYTHON_ROOT=E:/Python" "-sPYTHON_VERSION=2.4"
编译和设置⼯作到此为⽌。下⾯是⼀个使⽤Boost.Python为Python提供接⼝的⼀个实例。
Hello Boost.Python
本节使⽤Boost.Python写⼀个Hello world实例来说明简单的使⽤。
编写C++库源⽂件
使⽤Boost.Python处理C++的接⼝
编写makefile编译⽂件,⽣成动态链接库
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") //⽣成相关对象
<() //调⽤相关函数
封装C++特性
封装简单函数
/* hello.cpp */
#include <boost/python.hpp>
using namespace boost::python;
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello)
{
def("greet", greet);
}
封装简单类
见章节Hello Python
简单封装STL容器
python默认安装路径/*container.cpp*/
#include <vector>
#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
using namespace boost::python;
typedef std::vector<double> iovect;
BOOST_PYTHON_MODULE(container)
{
class_<std::vector<double> >("iovect")
.
def( vector_indexing_suite< std::vector<double> > () );
class_<std::vector<iovect> >("iovect_vec")
.def( vector_indexing_suite< std::vector<iovect> > () );
}
封装有默认参数值的函数
/*args.cpp*/
#include <iostream>
#include <string>
#include <boost/python.hpp>
using namespace boost::python;
void ShowPerson(std::string name, int age=30, std::string nationality="Chinese")
{
std::cout<<name<<'_'<<age<<'_'<<nationality<<'/n';
}
// 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在程序互相调⽤⽅⾯也提供了很好的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。