生成python绑定,使用哪些方法/程序

ceo*_*ron 17 c++ python python-bindings

我正在我的程序中使用python(CPython)来允许我的环境中的用户脚本,并允许我使用pyside,c ++的qt绑定为我的应用程序创建GUI.这些可以有效地分离,以后可以编译GUI python代码以获得速度(如果可能的话).

我是python的新手,我真的在寻找最有效的方法来生成可靠的最小额外代码来生成实体绑定,因为随着项目的发展,绑定可能会经常发生变化.我需要它,以便python类扩展具有虚拟的c ++类.

我已经研究过PyBindGen,它在我的库中的东西上经常窒息,因为它实际上很有用.

您在这方面建议的任何帮助/建议/链接/工作流程都非常有用.

And*_*jos 14

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

也就是说,我必须补充这一点,通常,当你绑定时,你不要盲目地将你在C++中拥有的所有内容绑定到Python中 - 如果你这样做,你就不会从python那里得到一种非常pythonic的感觉.相反,您可以用最pythonic的方式设计如何在Python中使用库,然后再回过头来看看如何使用其中一个可能的绑定库将其修补到C++代码中.例如,std::vector您不希望处理's,而是希望您的库调用处理Python列表或迭代.如果您的C++库收到了std::map,那么您希望使用Python词典来处理它.如果它是一个数组,也许numpy.ndarray会更方便.等等...

也就是说,您仍然可以设计绑定,以便最大限度地减少维护.

以下是其他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 - 自2014年12月6日起无效(v2.8),转移到github(https://github.com/MarcusTomlinson/ECS-Python)
  3. PyCXX - C++工具使编写Python扩展更容易 - 无效?最后一个版本是2017年4月23日的v7.0.2
  4. CLIF - CLIF为为各种语言创建C++包装器生成器提供了一个共同的基础 - 不活动?回购活动不多(仅提交14次)

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

  1. ctypes - 这是Python的原生,不需要外部模块安装.
  2. cffi - 这是一个受Lua JIT等效设计启发的新套装.

  • 此列表的新增内容是pybind11(https://github.com/wjakob/pybind11,http://pybind11.readthedocs.org/en/latest/).免责声明:我是作者. (2认同)

djc*_*djc 0

AFAICT,C++ 没有那么多选择。SWIG是较旧的项目之一;据报道,它有点神秘和笨重,但由于它已经存在很长时间了,它也应该涵盖许多其他项目未处理的内容。您可能还想看看Cython