41

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

我尝试的替代方案是:

  • Boost.Python

    我喜欢 Boost.Python 生成的更简洁的 API,但它需要用户安装额外的依赖项这一事实使我们切换到 SWIG。

  • 痛饮

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

你以前做过什么,你有什么经验?

4

5 回答 5

23

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

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

于 2008-11-10T07:41:53.237 回答
18

编辑 - Robin 项目遗憾地被放弃了,今天不会有太大用处

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

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

于 2008-11-13T23:03:19.487 回答
7

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

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

  2. SIP 的执行时间远小于 SWIG。请参阅Python 包装器工具:性能研究。不幸的是,链接似乎已损坏。我有一份个人副本,可应要求共享。

于 2008-11-13T14:45:33.437 回答
5

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

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

于 2008-11-10T07:42:23.393 回答
2

Boost::Python 的一大优点是它允许在 ipython shell 中完成制表符:您导入一个由 Boost 直接公开的 C++ 类,或者您将其子类化,从那时起,它的行为就像一个纯 Python 类。

缺点:安装和使用 Boost 需要很长时间,以至于所有 Tab 完成时间节省都不会摊销;-(

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

于 2009-05-11T11:27:15.507 回答