用C++为python写扩展库

C++为python写扩展库

Boost.Python的简明入门指南

 

Boost.Python Boost 中的一个组件, 使用它能够大大简化用 C++ Python 写扩展库的步骤,提高开发效率,为两种语言的混和编程提供了极大方便。

编译Boost.Python

编译Boost.Python可以根据Boost库的编译指南,编译整个Boost库,然后相应安装,其中包括Python库的安装。这里介绍只编译Boost库。

编译一 Windows + VC 6

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目录下,拷贝编译的libdll文件到$(boost_install)/lib目录下。

5.      添加环境变量。

a)      include中增加$(boost_install)/include

b)      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

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.PythonPython提供接口的一个实例。

Hello Boost.Python

本节使用Boost.Python写一个Hello world实例来说明简单的使用。

编写C++库源文件

  用C++为python写扩展库_第1张图片

使用Boost.Python处理C++的接口

用C++为python写扩展库_第2张图片

编写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") //生成相关对象

bs.greet() //调用相关函数

封装C++特性

封装简单函数

/* hello.cpp */

#include

using namespace boost::python;

char const* greet()

{

return "hello, world";

}

BOOST_PYTHON_MODULE(hello)

{

def("greet", greet);

}

 

封装简单类

见章节Hello Python

简单封装STL容器

/*container.cpp*/

#include

 

#include

#include

using namespace boost::python;

 

typedef std::vector iovect;

 

BOOST_PYTHON_MODULE(container)

{

    class_ >("iovect")

        .def( vector_indexing_suite< std::vector > () );

    class_ >("iovect_vec")

        .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());

}

 

总结

语言的混和编程是一个值得深入探讨的问题,每种编程语言都有应用的特定应用环境,和各自的优点PythonC++有一脉相承的地方也有很多互补的地方。Boost库和C++ 0X的标准在C ++python的扩展方面做了很多工作,Boost.Python是很重要的一个产物。除了为Python提供接口以外,Boost.Python在程序互相调用方面也提供了很好的支持。

你可能感兴趣的:(python,c,vector,module,include,path)