Python的C++扩展

来源:互联网 发布:arttemplate.js 使用 编辑:程序博客网 时间:2024/05/12 05:41

Python以其强大的功能、简洁的语法、出色的效率成为当前领先的OO动态语言。在Python中,所有内容都是对象,包括方法。Python的强大的原因之一是其可以用C/C++进行方便地扩展,它的许多高级功能也是通过这种方式获得的。使用C++进行扩展,目前比较流行的有两种方式:一种为SWIG,还有一种为Boost::Python库。

       我们知道,在如今各种语言不断涌现的今天,它们之间能否互操作,尤其是和主流的高级语言之间的互操作性,是决定其前景的重要因素之一。每种语言都有自己的类型系统和内存管理的方式,因此不同语言之间要交互,就需要完成不同类型之间的转换和对象生命周期的跟踪管理。

       PythonC++扩展主要涉及两方面的内容:导出方法表和类型转换。

SWIG被称为通用的语言粘合剂。它采用了一种独特的方法来解决不同语言间的互操作问题,PythonC++扩展只是它的一种应用。具体到PythonC++扩展上,除了你的C++代码外,你通常只需要编写一个转换用的语法文件(扩展名为.i),类似下面的格式:

/* File : example.i */

%module example

 

%{

#include "example.h"

%}

 

%{

typedef Shape* PShape;

%}

 

%include"std_list.i"

 

namespace std

{

    %template(stdShapeList) list<PShape>;

}

 

/* Let's just grab the original header file here */

%include "example.h"

 

%inline %{

PShape deref(PShape* x) {

    return *x;

}

PShape ref(Circle* x){

return x;

}

%}

 

SWIG是一个非常有前景的技术。它声称已经支持绝大部分的C++特性,也支持STL的常用容器。不过因为它的通用性,在性能上和对语言特性的支持上都不及下面的Boost提供的Python库。在实际应用时,使用SWIG遇到了stl::list无法转换成功的问题。并且,上面描述的只是PythonC++的调用,如果要在C++中调用Python,似乎SWIG无法做到。这些让我不得不转求其它方法。

Boost是一个采用模板技术封装的庞大的C++标准库扩展,其中,最新的1.33.1版本中强化了对Python的支持,技术已经比较成熟。它封装了完整的Python基本类型,并且提供了一系列的宏便于完成导出函数表,使得我们可以方便地在PythonC++之间进行调用。在实际使用中,还没有遇到任何问题。详细内容可以访问

http://www.boost.org/libs/python/doc/index.html

 

其它资源:

1.       Python for windows extensionshttp://www.python.org/windows/pythonwin/

2.       Python and COMhttp://www.activestate.com/python/

3.       IronPython.Net上的Python):http://www.codeplex.com/IronPython

4.       SWIG官方网站:http://www.swig.org/

5.       Python官方网站:http://www.python.org/

6.       一篇不错的介绍SWIG for Python extensions in C++的文章:

http://www.geocities.com/foetsch/python/extending_python.htm

 
接下来的工作,便由SWIG自动完成,即:根据语法文件的指引,在你的C++类和Python之间产生一个适配的C文件,最后编译成python扩展动态库(*.pyd)。当我们在py中调用该pyd中的对象和方法时,该适配文件作为一个桥梁,将调用传递到C++的原始代码中。
原创粉丝点击