将C++ API暴露给Python

42

我目前正在从事一个项目,需要使用Python封装C++类以便运行程序。我的特定经验还涉及在我们的程序中嵌入Python解释器。

我尝试过的替代方案是:

  • Boost.Python

    我喜欢使用Boost.Python产生的更清晰的API,但它需要用户安装额外的依赖库,这促使我们转向SWIG。

  • SWIG

    对我们来说,SWIG的主要优点是不需要最终用户安装它即可使用程序。

你用过什么工具来做这个?你的经验如何?

5个回答

23

我曾在同一个项目中都使用过Boost和SWIG: Boost更好地与STL以及特别是C++异常集成。此外,其内存管理机制(试图桥接C++内存管理和Python GC)比SWIG的要灵活得多。然而,SWIG有更好的文档、没有外部依赖,如果你获得了用于Python的SWIG库包装,那么你就已经完成了一半以上的工作,可以得到Java/Perl/Ruby的包装。

我认为没有明显的选择:对于较小的项目,我仍会选择Boost.Python,对于更大的长期项目,额外投入SWIG的价值是值得的。


18

编辑 - Robin项目已经不再更新,现在并没有太大用处。

我曾成功地使用Robin

Robin很好地集成了C++类型,并创建了一个单独的.cpp文件,可以编译并包含在您的共享对象中。


1
+1我以前从未听说过这个,但它看起来相当不错。 - ConcernedOfTunbridgeWells
链接似乎已经失效。这里有一个可用的链接:http://pypi.python.org/pypi/Robin/1.0.1 - Jason Sundram
谢谢Jason,更新的项目链接是http://code.google.com/p/robin/(版本1.0.4已发布),已编辑答案。 - orip
在2017年:尽管这个答案已经获得了18个赞,但是这个项目似乎被困在废弃的Google Code存储库中,而且仍然不确定它是否已经在其他地方复活。 - Mr. Developerdude
@LennartRolland - 说得对,最后一个版本发布于2009年,可能在今天已经无法使用了。 - orip

7

我建议使用SIP。 SIP比SWIG更好,原因如下:

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

  2. SIP的执行时间比SWIG短得多。请参阅Python Wrapper Tools:性能研究。不幸的是,链接似乎已经失效了。如果需要,我可以分享个人副本。


我有兴趣看看它。你能把它发布到某个地方并链接给我吗?否则,我们可以安排你直接把它发送给我。 - Marcos Lara
5
网络档案馆有一个副本:http://web.archive.org/web/20070703071726/http://people.web.psi.ch/geus/talks/europython2004_geus.pdf - Peter Rowell
我认为基准测试对SWIG没有意义。作者没有使用SWIG的-builtin或-O标志,这两个标志可以显著提高性能。 - dbn

5

PyrexCython也是将两个世界结合的好而简单的方法。

使用这些工具包装C ++比包装C要棘手一些,但是可以做到。 这里是关于它的维基页面。


2
Boost::Python的一个优点是它允许在ipython shell中进行tab键自动补全:您可以导入由Boost直接公开的C++类,或者对其进行子类化,从那时起,它确实表现得像一个纯Python类。
缺点是:安装和使用Boost太耗费时间,以至于所有节省Tab键补全时间的好处都无法弥补;-(
因此,我更喜欢Swig:没有花哨的东西,但在简短的介绍示例之后可靠地工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接