python能和c结合_整合Python和C ++

将Python与C / C ++接口并不是一件容易的事。

在这里,我将复制/粘贴上一个问题的上一个答案,以用于编写python扩展的不同方法。 具有Boost.Python,SWIG,Pybindgen ...

您可以使用Python C-API用C或C ++自己编写扩展。

一言以蔽之:除了学习如何做之外,不要那样做。 正确地做到这一点非常困难。 您将不得不手动增加和减少引用,并编写大量代码以仅暴露一个功能,而这几乎没有好处。

痛饮

优点:您可以为许多脚本语言生成绑定。

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

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

我不再使用它了。

Boost.Python:

优点:这是一个非常完整的库。 它使您几乎可以完成C-API所能完成的所有工作,但只能使用C ++。 我从来没有用此库编写C-API代码。 由于该库,我也从未遇到过bug。 绑定代码要么像超级按钮一样工作,要么拒绝编译。

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

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

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

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

缺点:仅是Boost.Python本身引起的问题。

编辑该项目看起来已停产。 虽然可能仍在工作,但最好考虑切换。

毕宾根(Pybindgen):

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

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

无论如何都值得尝试!

Pyrex和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一样,它可能会导致较长的编译时间和庞大的库。 我还没有做任何基准测试。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值