python/c++接口库比较(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )

Posted 水墨禅心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python/c++接口库比较(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )相关的知识,希望对你有一定的参考价值。

《python/c++接口库比较(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )》http://blog.csdn.net/lainegates/article/details/19565823

目前有很多开源的Python/c++ 绑定工具,搜了好多岾子,这里稍微总结下。

SWIG

  • 支持 Python 2 and 3
  • 配置正确的话,可以全自动完成封装(*.i文件需要自己写)
  • 当不是全自动的时候,它大多会重复你的.h文件并给出提示
  • 除了Python外,还支持其他语言(Java, Ruby, Lua, 等)
  • 输出一个本地文件(这个文件会被编译成.pyd)和一个封装(这个封装是python脚本,调用对应生成的.pyd)
  • 绑定(Bindings)的性能不是太好,不支持内部类(inner classes)的封装
  • 不支持属性(通过getter/setters访问values)
  • 文档很全,很容易学习
  • google使用了
  • C++支持不太好

Boost::Python

  • 支持 Python 2, 3和C++的绑定
  • 对于新手来说,学习它的语法有一定难度。但是这些语法很直观
  • 大量使用了 C++ templates (可能是好事,也可能是坏事),会很明显地提高编译时间
  • 随boost库一起发布,且boost库有用,但很大
  • 刚开始编译使用boost.python封装好的C++代码时,出现的各种错误
  • 一些语法不易学习,像函数返回值时的规则
  • 非常可靠、稳定、经过充分测试的库(boost库里的部件都具有这特性)
  • 不支持属性
  • 支持文档写得比较差,有些功能文档里甚至都没有写。
  • 编译后的pyd文件有些大,这不利于在手机或者嵌入平台使用
  • 配合py++使用,几乎可以全自动封装项目

Py++

  • 支持 Python 2, 3 和C++的绑定
  • 它调用boost.python自动完成项目绑定,相当于boost.python的高级工具

PyCxx

  • 支持 Python 2, 3 和C++的绑定
  • 轻量级的封装库,用的人挺多
  • 只支持C++
  • 目前没有自动绑定工具

Python C api(Python 的帮助文档里有)

  • 性能高
  • 灵活
  • 适合嵌入式
  • C++支持差
  • 复杂

ctypes(Python自带的库)

  • 灵活
  • 对c的代码几乎无缝调用
  • 使用起来比较繁琐
  • 只支持c语言

SIP

  • 支持 Python 2, 3 和C++的绑定
  • 在PyQt中使用过,其他地方很少见它

Weave

  • 性能高
  • 很少见

Pyrex

  • 很少见
  • 目前还没有成熟的项目
  • 性能较高
  • 接近于Python语法

参考:http://stackoverflow.com/questions/1492755/python-c-binding-library-comparison

http://web.archive.org/web/20090604182721/http://www.suttoncourtenay.org.uk/duncan/accu/integratingpython.html

https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages

 

《Python扩展方法及工具比较》http://www.cdadata.com/4224

使用工具进行扩展:
虽然扩展过程并不复杂,但也可以使用许多已知的工具简化扩展过程。
(1) SWIG
由David Beazley创建,是一个自动的扩展构造工具。它读入注释的C/C++头文件,为python、tcl、perl等多种脚本语言产生wrap代码。SWIG可以包装大量C++特性到Python的扩展模块中。详情可参考http://www.swig.org。
评价:swig简单,可以支持多种脚本文件,但支持的c++特性不完备。

(2) SIP
由Phil Thompson创建,是一个C++模块构造器,专门为C++的类创造wrapper。它曾经被用于创建PyQt和PyKDE扩展模块,因此比较出名。详情可参考http://www.riverbankcomputing.co.uk/sip/。
评价:支持C++特征很齐全,但比较复杂。

(3) bgen
该工具被包含在标准Python发布包中的模块构建工具集里,由Jack Jansen维护。它用于产生在Macintosh版本可用的Python扩展模块。

(4) pyfort
由Paul dubois创建,用来产生Fortran语言生成的扩展模块。详见http://pyfortran.sourceforge.net。

(5) cxx
也由Paul Dubois创建,是一个库,为Python的C++扩展提供了友好的API。Cxx允许将许多python对象(如list和tuple)使用到STL的运算中。库也提供了C++异常处理到python异常处理的转化。详见http://cxx.sourceforge.net。

(6) WrapPy
由Greg Couch创建,通过读入C++头文件来产生扩展模块。详见http://www.cgl.ucsf.edu/home/gregc/wrappy/index.html。

(7) Boost Python Library
由David Abrahams创建。该库提供了更多与众不同的C++ wrap到python扩展中,而只需要对要扩展的C++类写很少的附加信息。详见http://www.boost.org/libs/python/doc。
评价:Boost为C++提供了许多实用的库,如Regex(正则表达式库)、Graph(图组件和算法)、concept check(检查泛型编程中的concept)、Thread(可移植的C++多线程库)、Python(把C++类和函数映射到Python之中)、Pool(内存池管理)等等。
Boost总体来说是实用价值很高,质量很高的库。并且强调对跨平台的支持。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎。
boost.python支持的c++特性较多,但是比较复杂。

以上是关于python/c++接口库比较(SWIG,boost.python, pycxx, py++, sip, Weave, Pyrex )的主要内容,如果未能解决你的问题,请参考以下文章

准系统 SWIG python C 接口在 OSX+clang 上出现段错误,而不是在 Linux+gcc 中

使用 swig 包装类似读/写的函数

如何使用swig为c++生成php接口so

使用 SWIG 绑定 Python/C++ 模板

为静态库编译 SWIG Python 包装器?

使用 SWIG 从 Python 向 C 传递和数组参数