您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

整合Python和C ++

整合Python和C ++

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

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

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

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

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

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

我不再使用它了。

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

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

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

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

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

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

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

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

无论如何都值得尝试!

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

现在Py 似乎已停产,我现在正在寻找 一个不错的选择。我目前正在为自己的C 库使用C??ython进行实验。这种语言是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。

一个新的pybind11,类似于Boost.Python,但有一些潜在的优点。例如,它使用C ++ 11语言功能来简化创建新绑定的过程。它也是一个仅标头的库,因此在使用它之前无需编译,也没有链接的库。

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

python 2022/1/1 18:45:24 有306人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶