2008-11-10 63 views
37

我目前正在研究一个项目,我不得不用Python包装C++类以便能够编写脚本程序。所以我的具体经验也涉及到在我们的程序中嵌入Python解释器。向Python公开一个C++ API

我试过的替代品:

  • Boost.Python的

    我喜欢用Boost.Python的产生的更简洁的API,但事实上,它会要求用户安装做一个额外的依赖我们切换到SWIG。

  • 痛饮

    呷主要用于我们的优势是,它不要求最终用户安装使用的最终方案。

你以前做过什么,以及你曾经使用过什么?

回答

22

我用两个(同一项目):加速是较好的综合与STL,特别是C++异常。另外,它的内存管理机制(试图连接C++内存管理和Python GC)比SWIG更灵活。但是,SWIG具有更好的文档,没有外部的依赖关系,如果你包裹在夜风库为Python你比那里得到一个Java/Perl的/ Ruby包装器,以及中途更多。

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

5

pyrexcython也是两个世界的混合良好和简便的方法。

包装C++使用这些工具是麻烦一下,然后包装C,但它可以做到的。 Here是关于它的维基页面。

6

我建议SIP。由于以下原因,SIP比SWIG更好:

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

  2. 执行时间比痛饮的要少得多。请参阅Python Wrapper Tools: A Performance Study。不幸的是,链接似乎中断我有一个可以根据要求共享的个人副本。

+0

我有兴趣看到它,你可以发布它的地方,并链接到它?否则,我们可以安排你直接发送给我 – 2008-11-13 16:56:03

+4

wayback机器有一个副本:http: //web.archive.org/web/20070703071726/http://people.web.psi.ch/geus/talks/europython2004_geus.pdf – 2008-11-14 00:00:18

18

编辑 - 罗宾项目可悲的是被遗弃的,并且将没有多大用处今天

我用Robin取得了巨大成功。

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

2

Boost :: Python的一大优点是,它允许在ipython shell中完成tab:您可以直接导入由Boost公开的C++类,或者将其子类化,并且从此它的行为就像纯Python类。

的缺点:它需要很长时间来安装和使用,所有的制表完成省时永远不会摊销;-(

升压所以我更喜欢痛饮:不花俏,但工作可靠经过一个简短的介绍性例子,