向Python公开C ++ API

时间:2008-11-10 00:34:50

标签: c++ python boost swig

我正在开发一个项目,因为我必须用Python包装C ++类才能编写程序脚本。所以我的具体经验还包括在我们的程序中嵌入Python解释器。

我尝试的替代方案是:

  • Boost.Python的

    我喜欢Boost.Python生成的更干净的API,但事实上它需要用户安装额外的依赖项才能让我们切换到SWIG。

  • SWIG

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

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

5 个答案:

答案 0 :(得分:23)

我已经使用过两者(对于同一个项目):Boost与STL更好地集成,尤其是C ++异常。此外,它的内存管理机制(试图桥接C ++内存管理和Python GC)比SWIG更灵活。但是,SWIG有很多更好的文档,没有外部依赖,如果你把这个库包装在SWIG for Python中,那么获得Java / Perl / Ruby包装的时间已经超过了一半。

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

答案 1 :(得分:18)

编辑 - 罗宾项目遗憾地被遗弃,今天用得不多

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

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

答案 2 :(得分:6)

我建议SIP。由于以下原因,SIP优于SWIG:

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

  2. SIP的执行时间远远少于SWIG的执行时间。请参阅Python Wrapper Tools: A Performance Study。很遗我有个人副本,可以根据要求分享。

答案 3 :(得分:5)

pyrexcython也是混合这两个世界的好方法。

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

答案 4 :(得分:2)

Boost :: Python的一大优点是它允许在ipython shell中完成选项卡:你导入一个直接由Boost公开的C ++类,或者你将它子类化,从那时起,它的表现就像一个纯粹的Python类。

缺点:安装和使用Boost需要很长时间,所有Tab-completion省时都不会分期付款; - (

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