我正在考虑在我的程序中使用 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++ 包装的列表,以防您决定进一步查看:
- SWIG - 你已经知道了
- Boost.Python - 这是我们通常在这里使用的 - 结构很好
- Cython - 非常简洁的语法接近 Python - 他们声称比 Boost.Python 快得多
- SIP - 不是很广泛,但它就在那里
- pybind11 - 类似于 Boost.Python 的语法,得益于 C++11 的紧凑实现。
这些现在处于非事件状态:
- PyBindGen - 自 2017 年 5 月 21 日(上一个版本于 2014 年发布)以来,声称是最快的,但不活跃 - 目前在 github 上维护 (https://github.com/gjcarneiro/pybindgen/releases)
- ECS:Python - inactive 自 2014 年 12 月 6 日 (v2.8) 起,移至 github (https://github.com/MarcusTomlinson/ECS-Python)
- PyCXX - 使编写 Python 扩展更容易的 C++ 工具 - 不活跃? 最后一个版本是 2017 年 4 月 23 日的 v7.0.2
- CLIF - CLIF 为为各种语言创建 C++ 包装器生成器提供了一个通用基础 - 不活跃? repo 上没有太多事件(只有 14 次提交)
为了完整起见,还可以将编译后的 C 代码直接加载到 Python 中,而无需创建正式的绑定(bind)。您可以使用 FFI 使用这两个 Python 模块中的任何一个:
关于c++ - 生成python绑定(bind),使用什么方法/程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13990317/