将C ++ API公开给Python

我目前正在做一个项目,我不得不用Python来包装C ++类,以便能够编写脚本。 所以我的具体经验也涉及在我们的程序中embeddedPython解释器。

我试过的select是:

  • Boost.Python的

    我喜欢Boost.Python生成的清洁API,但事实上,它会要求用户安装额外的依赖关系,使我们切换到SWIG。

  • 痛饮

    SWIG对我们的主要优势是它不需要最终用户安装它来使用最终的程序。

你曾经做过什么,你有什么经验呢?

我已经使用了两个(对于同一个项目):Boost更好地集成了STL,特别是C ++exception。 另外,它的内存pipe理机制(试图架设C ++内存pipe理和Python GC)比SWIG更为灵活。 但是,SWIG具有更好的文档,没有外部的依赖关系,如果你在Python中使用SWIG封装了库,那么获得Java / Perl / Ruby包装器也就不止一半了。

我不认为有一个明确的select:对于较小的项目,我会再次使用Boost.Python,对于更长期的项目,额外的SWIG投资是值得的。

编辑 – 罗宾项目被遗弃,今天不会用太多

我用Robin取得了巨大的成功。

与C ++types很好的集成,并创build一个.cpp文件来编译并包含在共享对象中。

我build议SIP 。 SIP比SWIG好,原因如下:

  1. 对于给定的一组文件,swig生成比SIP更多的重复(开销)代码。 SIP通过使用可静态或dynamic链接的库文件来pipe理生成较less的重复(开销)代码。 换句话说,SIP具有更好的可扩展性。

  2. SIP的执行时间远远小于SWIG的执行时间。 参考Python包装工具:性能研究 。 不幸的是链接显示中断 我有一个可以根据要求共享的个人副本。

pyrex或者cython也是混合两个世界的好方法。

使用这些工具包装C ++是有点棘手,然后包装C但它可以完成。 这里是关于它的维基页面。

Boost :: Python的一大优点是它允许在ipython shell中完成tab:你直接导入一个由Boost公开的C ++类,或者你inheritance它,从那开始,它的行为就像一个纯Python类。

缺点:安装和使用Boost需要很长的时间,所有的Tab完成时间节省将永远不会摊销;-(

所以我更喜欢Swig:没有花里胡哨的东西,但是在一个简短的介绍性例子之后可靠地工作。