Python的C++扩展
来源:互联网 发布:arttemplate.js 使用 编辑:程序博客网 时间:2024/05/12 05:41
Python以其强大的功能、简洁的语法、出色的效率成为当前领先的OO动态语言。在Python中,所有内容都是对象,包括方法。Python的强大的原因之一是其可以用C/C++进行方便地扩展,它的许多高级功能也是通过这种方式获得的。使用C++进行扩展,目前比较流行的有两种方式:一种为SWIG,还有一种为Boost::Python库。
我们知道,在如今各种语言不断涌现的今天,它们之间能否互操作,尤其是和主流的高级语言之间的互操作性,是决定其前景的重要因素之一。每种语言都有自己的类型系统和内存管理的方式,因此不同语言之间要交互,就需要完成不同类型之间的转换和对象生命周期的跟踪管理。
Python的C++扩展主要涉及两方面的内容:导出方法表和类型转换。
SWIG被称为通用的语言粘合剂。它采用了一种独特的方法来解决不同语言间的互操作问题,Python的C++扩展只是它的一种应用。具体到Python的C++扩展上,除了你的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无法转换成功的问题。并且,上面描述的只是Python到C++的调用,如果要在C++中调用Python,似乎SWIG无法做到。这些让我不得不转求其它方法。
Boost是一个采用模板技术封装的庞大的C++标准库扩展,其中,最新的
http://www.boost.org/libs/python/doc/index.html
其它资源:
1. Python for windows extensions:http://www.python.org/windows/pythonwin/
2. Python and COM:http://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++的原始代码中。- Python的C扩展
- Python 的C语言扩展
- python的C、c++扩展
- Python的C/C++扩展
- python的C、c++扩展
- Python的C/C++扩展
- Python的C/C++扩展
- Python的C扩展问题
- 创建python的c扩展
- 用C语言扩展Python的功能
- 用C语言扩展Python的功能
- 用C语言扩展Python的功能
- Python的路径及C语言扩展
- 用C语言扩展Python的功能
- 用C语言扩展Python的功能
- 用C语言扩展Python的功能
- 用C语言扩展Python的功能
- 用C语言扩展Python的功能
- C/C++ 笔试、面试题目大汇总
- 想父亲
- 装饰模式在Intermec CK1应用程序中通讯模块的应用
- 工作一年啦
- 让你二十年后仍是人才
- Python的C++扩展
- 从今天起,我要开始写博客了
- [转]Lucene 中文分词的 highlight 显示
- 一年前写的C#的一些文章
- .Net程序中如何彻底关闭Excel - 关闭进程外COM方法
- 明天就要毕业了
- Remoting中的找不到程序集的原因之一
- ipc连接知识
- Remoting中无法创建代理类型的错误