我正在学习C++,因为它是一种非常灵活的语言。但是对于Twitter,Facebook,Delicious等其他互联网设备,Python似乎是一个更好的解决方案。
是否可以在同一项目中集成C ++和Python?
将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模块。
编辑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一样,它可能会导致较长的编译时间和庞大的库。我还没有做任何基准测试。