【问题标题】:Exposing a C++ API to Python向 Python 公开 C++ API
【发布时间】:2010-09-21 13:31:29
【问题描述】:

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

我尝试过的替代方案是:

  • Boost.Python

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

  • 痛饮

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

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

【问题讨论】:

    标签: c++ python boost swig


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • +1 以前从未听说过这个,实际上看起来还不错。
      • 链接似乎已损坏。这是一个有效的方法:pypi.python.org/pypi/Robin/1.0.1
      • 感谢 Jason,更新后的项目链接为code.google.com/p/robin(1.0.4 版本已出),已编辑答案。
      • 2017 年:虽然这个答案获得了 18 票,但这个项目似乎被困在废弃的谷歌代码仓库中,是否已经在其他地方恢复仍然不确定。
      • @LennartRolland - 很公平,最后一个版本是 2009 年发布的,今天可能无法使用
      【解决方案3】:

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

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

      2. SIP 的执行时间远小于 SWIG。请参阅Python Wrapper Tools: A Performance Study。不幸的是,链接似乎已损坏。我有一份可以根据要求共享的个人副本。

      【讨论】:

      • 我有兴趣看到它。你能把它贴在某个地方并链接到它吗?否则我们可以安排您直接发送给我。
      • 我认为基准对 SWIG 没有意义。作者没有为 SWIG 使用 -builtin 或 -O 标志,这两者都显着提高了性能。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-02-06
          • 2021-08-29
          • 2011-02-05
          • 1970-01-01
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多