【问题标题】:Interfacing C/C++ libraries with Python将 C/C++ 库与 Python 连接
【发布时间】:2012-12-20 03:53:21
【问题描述】:

我有一个需要能够与 python 交互的 C++ 库。我阅读了this question 以了解我需要适应的选择。

我看到 SWIG 和 Cython 并想选择 SWIG,主要是因为我的 Python 编程经验非常少。但是,我意识到使用 Swig 我必须为每个类编写一个接口(.i 扩展)。现在,我的 C++ 项目非常庞大,我觉得我需要花费大量时间来完成包装器(或者我可能错了)。

所以现在,由于我的应用程序很大,我需要做出选择。在引用的线程中,我遇到了 Boost Python。现在,我无法再决定并希望得到可以告诉我其中一种优缺点的人的意见。请注意,我的偏好是易于使用以及可以多快完成。我愿意为此牺牲系统性能。如果有人可以为我提供一个 SWIG 实现的项目或 Boost Python 实现的项目链接,我将不胜感激(一个完整的模块而不是示例教程会更好!)

【问题讨论】:

标签: python boost swig cython boost-python


【解决方案1】:

Boost::python 在 C++ 和 Python 之间提供了一个几乎没有包装的接口。它还允许您编写自定义转换器和其他使 Python 接口更好的整洁的东西。接口是纯 C++ 的,但它们依赖于模板和巧妙的设计模式,使其看起来非常漂亮和声明性。您还可以从编译器直接检查您的连接器代码中受益。

使用 Swig,您可以在 Swig 自己的 DSL 中编写接口声明,这需要几天时间才能掌握。此外,它总是插入一个包装层,所以它可能会慢一些。然而,它确实有一个很好的特性,可以自动为你转换很多东西,而不必声明任何额外的东西。但是它生成的包装器很难调试。

恕我直言 boost::python 是更好的选择,因为您可以直接使用 CPython 的原生 C 接口。我使用 Swig 进行 Java 和 C++ 交互,因为 JNI 是个熊,Python 的 C 接口实际上完全可以自己使用。

如果你已经有一堆 Swig 包装器,我会保留它们,因为你必须重做所有这些工作。但是,开始一个新项目,或者如果您需要最高性能,请一路提升::python!

【讨论】:

  • 谢谢。 !所以我深入研究 boost::python 以使原型运行。也感谢您提供文档链接。
  • 试试 pybind11,它允许自动转换多种类型。(并且不使用整个 boost 库)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
相关资源
最近更新 更多