c++ - 生成python绑定(bind),使用什么方法/程序

标签 c++ python python-bindings

我正在考虑在我的程序中使用 python (CPython) 来允许在我的环境中编写用户脚本,并允许我使用 pyside(c++ 的 qt 绑定(bind))为我的应用程序创建 GUI。这些可以有效地分开,因为 GUI python 代码以后可以编译掉以提高速度(如果可能的话)。

我对 python 很陌生,我真的在寻找最有效的方法来生成可靠的绑定(bind),并且需要维护的附加代码绝对最少,因为绑定(bind)可能会随着项目的发展而经常变化。我需要它以便 python 类扩展具有虚拟的 c++ 类。

您在这方面推荐的任何帮助/建议/链接/工作流程都会非常有帮助。

最佳答案

我知道只有两个项目有 C++ 的自动绑定(bind)生成器。第一个是 SWIG。正如其他一些答案已经说过的那样,它有点过时,但它确实有效。第二个是 Boost.Python - 它本身不会自动生成绑定(bind),但你可以使用 Boost.Pyste为你做。它需要 GCC-XML 来解析您的原始源代码并编写 Boost.Python 绑定(bind)。这两个选项都支持可以从 Python 重载的 C++ 中的虚拟方法。

也就是说,我必须补充一点,通常情况下,当你绑定(bind)时,你不会盲目地将 C++ 中的所有内容绑定(bind)到 Python 中——如果你这样做,你不会从 python 中获得非常 Python 的感觉边。相反,您以最 Pythonic 的方式设计您希望如何在 Python 中使用您的库,然后您回过头来看看如何使用可能的绑定(bind)库之一将其修补到您的 C++ 代码中。例如,与其处理 std::vector,不如让您的库调用处理 Python 列表或可迭代对象。如果您的 C++ 库收到 std::map,您希望使用 Python 字典来处理。如果它是一个数组,也许 numpy.ndarray 会更方便。等等……

也就是说,您仍然可以设计绑定(bind),从而最大限度地减少维护。

以下是其他 Python/C++ 包装的列表,以防您决定进一步查看:

  1. SWIG - 你已经知道了
  2. Boost.Python - 这是我们通常在这里使用的 - 结构很好
  3. Cython - 非常简洁的语法接近 Python - 他们声称比 Boost.Python 快得多
  4. SIP - 不是很广泛,但它就在那里
  5. pybind11 - 类似于 Boost.Python 的语法,得益于 C++11 的紧凑实现。

这些现在处于非事件状态:

  1. PyBindGen - 自 2017 年 5 月 21 日(上一个版本于 2014 年发布)以来,声称是最快的,但不活跃 - 目前在 github 上维护 (https://github.com/gjcarneiro/pybindgen/releases)
  2. ECS:Python - inactive 自 2014 年 12 月 6 日 (v2.8) 起,移至 github (https://github.com/MarcusTomlinson/ECS-Python)
  3. PyCXX - 使编写 Python 扩展更容易的 C++ 工具 - 不活跃? 最后一个版本是 2017 年 4 月 23 日的 v7.0.2
  4. CLIF - CLIF 为为各种语言创建 C++ 包装器生成器提供了一个通用基础 - 不活跃? repo 上没有太多事件(只有 14 次提交)

为了完整起见,还可以将编译后的 C 代码直接加载到 Python 中,而无需创建正式的绑定(bind)。您可以使用 FFI 使用这两个 Python 模块中的任何一个:

  1. ctypes - 这是 Python 原生的,不需要安装外部模块。
  2. cffi - 这是一个新包,灵感来自 Lua JIT 上的等效设计。

关于c++ - 生成python绑定(bind),使用什么方法/程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13990317/

相关文章:

Python 3 网页转行

python - 如何在 Python 中拆分这个以逗号分隔的字符串?

c++ - 如何在 Windows 8 中读取 GPIO 引脚

python - 使用 setUpTestData 的 Django 测试不会保留测试之间的更改

c++ - 在使用库和 CMake 时遇到问题

C++ 程序中函数的 Python 绑定(bind)

python - 在 Windows 上的 Python 中使用 GLFW

python - 是否可以在阻塞并可能回调 Python 的 C 函数之前释放 GIL?

c++ - 如何构建一个使用某些程序功能的库?

c++ - C++ 中的赋值运算符返回右值还是左值?