编写Python扩展

使用SWIG实现C++扩展Python

link:http://blog.csdn.net/panbinfeng/archive/2006/04/14/662563.aspx

1. 直接C扩展Python的方法
Python的扩展API是主要为C语言提供的,可以利用该API为要导出的C函数建立包装器(wrapper)。包装器用来处理Python对象与底层C函数中的变量与所需值之间的转换,并将C函数注册到Python的自定义module中。
假设将要导出的函数成为模块函数,对应wrapper中的函数为包装函数。则wrapper文件主要包含以下几个部分:
include "Python.h";
每个模块函数的包装函数,即:PyObject* Module_func();
每个模块函数的函数定义,即:PyMethodDef ModuleMethods[]对应表;
模块的初始化函数:void initModule()部分。
简单示例程序:

2. 怎样用SWIG生成C的wraper
SWIG是一个自动的扩展构造工具。它读入注释的源程序头文件(后缀为.i的脚本文件),为python、tcl、perl等多种脚本语言产生wrap代码。
步骤大致为:
(1) 写源程序;
(2) 写后缀为.i的脚本文件;
(3) 使用命令"swig -python example.i"生成example_wrap.c,example_wrap.doc;
(4) 编译连接成共享库。
脚本文件的格式很简单,只需要列出要导出的函数或类型,并注释必要信息。还以上面的example.c为例

接下来就可以在Python环境中使用example模块中的函数了。

3. 用SWIG生成C++的wraper
用SWIG生成C++的wrapper过程类似于C wrapper。它的步骤如下:
(1) 写.cpp源程序;
(2) 写.i脚本文件;
(3) swig -c++ -python foo.i
生成foo_wrap.c,foo_wrap.doc;
(4) 编译连接成共享库foo.so。
则生成Python的foo模块,可以通过调入foo模块使用其中的类成员函数、成员变量。
简单示例:

注:这里使用的SWIG版本为:swig-1.3.24。

 

使用Boost.Python扩展和嵌入Python - 征服Python,语言基础与典型应用

Link: http://book.51cto.com/art/200710/58100.htm

8.4.2  使用Boost.Python扩展和嵌入Python

通过Boost.Python可以在Python内使用C++类和函数。和SWIG一样Boost.Python简化了编写Python扩展的代码,而不用使用Python/C API。但与SWIG不同,Boost.Python是一个类库,无需再使用接口文件。

1.初始化和方法列表
在Boost.Python中可以通过使用BOOST_PYTHON_MODULE来命名模块名。在BOOST_PYTHON_MODULE中则可以使用def来实现使用Python/C API定义的方法列表。以下是一个简单的例子。

2.导出类
通过Boost.Python可以将在C++中定义的类及其方法、属性等导入Python中。以下程序在C++中定义一个Message类,然后通过BOOST_PYTHON_MODULE将其导入Python中。

以下代码在Python中使用编译好的Message模块。

3.类的成员属性
在C++中类的成员可以使用关键字声明为不同的属性。而在Python中则依靠类属性的命名方式。使用Boost.Python可以将其C++中类成员的属性传递给Python。如下所示代码使用Boost.Python来处理类成员的属性。将BOOST_PYTHON_MODULE中的代码改为如下所示。

此处将Message类中的成员msg设置为可读写,还可以使用“.def_readonly”将其设置为只读属性。对于类中的私有成员还可以使用 “.add_property”将其操作函数设置为Python类中的属性。如下代码使用“.add_property”对私有成员进行操作。

以下代码在Python中使用编译好的Message模块。

4.类的继承
C++中类的继承关系也可以通过Boost.Python反映到Python模块中。以下代码将父类和子类分别导入到Python模块中。

5.运算符重载
在Python中运算符重载实际是类专有方法的重载。在C++中对运算符重载后,通过Boost.Python可以传递给Python。如下代码将Msg类的“+”运算符重载,然后通过“.def(self + self)”传递给Python。

对于其他的运算符重载也可以使用同样的方法,如下所示。

6.使用Boost.Python在C++中嵌入Python
在C++中嵌入Python的主要问题是 C++与Python之间的数据类型的转换。Boost.Python对Python/C API进行封装,可以使用类似于Python的方式对数据进行声明、操作等。在Boost.Python中使用Object类封装了Python/C API中的 PyObject*。Boost.Python定义了与Python中列表、字典等对应的类,如表8-2所示。

表Boost.Python与Python中部分类的对应关系

 

Boost.Python

Python

list

列表

dict

字典

tuple

元组

str

字符串

 

Boost.Python提供了Python中对象的操作方法。如str类具有lower、split、title、upper等方法。而list类则具有append、count、extend等方法。以下代码使用Boost.Python在C++中嵌入Python。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值