集成Python和C++

Nat*_*pos 58 c++ python integration

我正在学习C++,因为它是一种非常灵活的语言.但对于像Twitter,Facebook,Delicious等互联网来说,Python似乎是一个更好的解决方案.

是否可以在同一个项目中集成C++和Python?

asc*_*bol 93

将Python与C/C++连接起来并不是一件容易的事.

在这里,我复制/粘贴一个问题的前一个答案,以便编写python扩展的不同方法.以Boost.Python,SWIG,Pybindgen为特色......

  • 您可以使用Python C-API在C或C++中自行编写扩展.

    总而言之:除了学习如何做之外,不要这样做.要正确地做到这一点非常困难.您将不得不手动递增和递减引用并编写大量代码以暴露一个函数,只有很少的好处.

  • Swig:

    亲:您可以为许多脚本语言生成绑定.

    缺点:我不喜欢解析器的工作方式.我不知道他们是否取得了一些进展但两年前C++解析器非常有限.大多数时候我不得不复制/粘贴我的.h标头来添加一些%字符,并为swig解析器提供额外的提示.

    我还需要不时地处理Python C-API(不是那么)复杂的类型转换.

    我不再使用它了.

  • Boost.Python:

    亲:这是一个非常完整的图书馆.它允许您使用C-API完成几乎所有可能的操作,但是在C++中.我从来没有用这个库编写C-API代码.我也从未遇到过因库而导致的错误.绑定代码既可以像魅力一样工作,也可以拒绝编译.

    如果您已经有一些要绑定的C++库,它可能是当前可用的最佳解决方案之一.但是如果你只有一个小的C函数来重写,我可能会尝试使用Cython.

    缺点:如果您没有预编译的Boost.Python库,那么您将使用Bjam(替代make).我真的很讨厌Bjam及其语法.

    用BP创建的Python库往往会变得肥胖.编译它们也需要很多时间.

  • Py ++:它的Boost.Python变得简单了.Py ++使用C++解析器来读取您的代码,然后自动生成Boost.Python代码.你也得到了作者的大力支持(不,不是我;-)).

    缺点:只有Boost.Python本身引起的问题.

    编辑此项目看起来已停止.虽然可能仍在工作,但考虑转换可能会更好.

  • Pybindgen:

    它生成处理C-API的代码.您可以在Python文件中描述函数和类,或者让Pybindgen自动读取标题并生成绑定(为此它使用pygccxml,Py ++的作者编写的python库).

    缺点:这是一个年轻的项目,团队规模比Boost.Python小.仍然存在一些限制:您不能公开自己的C++异常,不能对C++类使用多重继承.

    不管怎样,值得一试!

  • 耐热玻璃和Cython:

    在这里,您不会编写真正的C/C++,而是Python和C之间的混合.这个中间代码将生成一个常规的Python模块.

编辑2013年7月22日:现在Py ++看起来停止了,我现在正在寻找一个好的选择.我目前正在为我的C++库试验Cython.这种语言是Python和C之间的混合.在Cython函数中,您可以使用Python或C/C++实体(函数,变量,对象......).

Cython非常容易学习,性能非常好,如果你不需要连接旧的C++库,你甚至可以完全避免使用C/C++.

但是对于C++来说,它存在一些问题.它不像Py ++那样"自动化",所以它对于稳定的C++ API(现在是我的库的情况)可能更好.我用Cython看到的最大问题是C++多态.使用Py ++/boost:python,我能够在C++中定义一个虚拟方法,在Python中覆盖它,并在C++中调用Python版本.使用Cython它仍然可行,但您需要显式使用C-Python API.

编辑2017-10-06:

有一个新的,pybind11,类似于Boost.Python但具有一些潜在的优势.例如,它使用C++ 11语言功能来简化创建新绑定的过程.它也是一个只有头的库,因此在使用它之前没有任何东西可以编译,也没有要链接的库.

我玩了一点点,使用它确实非常简单和愉快.我唯一担心的是,像Boot.Python一样,它可能会导致编译时间过长和大型库.我还没有做过任何基准测试.

  • 请注意,您的 Py++ 链接不再有效。我认为他们搬到了这里:http://www.ohloh.net/p/pygccxml (2认同)
  • 仅供参考:pybind11文档包含有关编译时间和代码大小的基准(http://pybind11.readthedocs.org/en/latest/benchmark.html) (2认同)

Ott*_*ger 10

是的,可以,鼓励和记录.我自己做了,发现它很容易.

  • 你向Python公开了多少个函数/类来轻松找到这个任务? (2认同)