我学习 C + + 是因为它是一种非常灵活的语言。但对于 Twitter、 Facebook、 Delicious 等互联网应用而言,Python 似乎是一个更好的解决方案。
有可能将 C + + 和 Python 集成到同一个项目中吗?
你可以用 C + + 编写 Python 扩展。基本上 Python 本身是用 C 编写的,您可以使用它来调用您的 C 代码。您可以完全访问 Python 对象。还有 加油,巨蟒。
是的,这是可能的,鼓励和 记录在案。我已经做了自己,发现它是非常容易的。
Python/C API 参考手册 -C 和 C + + 程序员使用的 API,他们希望编写扩展模块或嵌入 Python。
Python 解释器的扩展与嵌入
描述了如何用 C 或 C + + 编写模块,以便用新模块扩展 Python 解释器。这些模块可以定义新的函数,也可以定义新的对象类型及其方法。该文档还描述了如何将 Python 解释器嵌入到另一个应用程序中,以作为扩展语言使用。最后,本文展示了如何编译和链接扩展模块,以便在底层操作系统支持这一特性的情况下,可以动态地(在运行时)将它们加载到解释器中。
尝试 耐热玻璃。使编写 Python 的 C + + 扩展变得更容易。
看这个:
用 C 或 C + + 扩展 Python
”如果你知道如何用 C 编程,向 Python 中添加新的内置模块是非常容易的。这样的扩展模块可以完成两件在 Python 中不能直接完成的事情: 它们可以实现新的内置对象类型,并且它们可以调用 C 库函数和系统调用。
为了支持扩展,Python API (Application Programmers Interface,应用程序编程接口)定义了一组函数、宏和变量,这些函数、宏和变量提供了对 Python 运行时系统大多数方面的访问。Python API 通过包含头部“ Python.h”合并到 C 源文件中
Http://www.python.org/doc/2.5.2/ext/intro.html
PS 它的拼写是“ Integration”:)
用 C/C + + 接口 Python 并非易事。
在这里,我将 上一个答案复制/粘贴到前一个问题上,用于编写 Python 扩展的不同方法。特别是 Boost。巨蟒,SWIG,Pybindgen..。
您可以使用 Python C-API自己用 C 或 C + + 编写扩展。
一句话: 除了学习如何做,不要做那件事。要正确地做这件事是非常困难的。您将不得不手动增加和减少引用,并编写大量代码,只是为了公开一个函数,这样做的好处很少。
Swig :
Pro: 您可以为许多脚本语言生成绑定。
缺点: 我不喜欢解析器的工作方式。我不知道他们是否取得了一些进展,但是两年前 C + + 解析器是相当有限的。大多数时候,我不得不复制/粘贴我的。H 标头以添加一些 %字符,并为 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。巨蟒很容易。Py + + 使用 C + + 解析器读取代码,然后生成 Boost。自动编写 Python 代码。你也得到了作者的大力支持(不,不是我; ——)。
缺点: 只有问题,由于 Boost。 Python 本身。
编辑 这个项目看起来已经停止了。虽然可能还在工作,但是最好考虑一下切换。
皮宾根:
它生成处理 C-API 的代码。您可以在 Python 文件中描述函数和类,也可以让 Pybindgen 读取头文件并自动生成绑定(为此它使用 pygccxml,一个由 Py + + 的作者编写的 Python 库)。
缺点: 这是一个年轻的项目,团队规模比 Boost 小。巨蟒。但仍然存在一些限制: 不能公开自己的 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 + +/ost: Python,我能够在 C + + 中定义一个虚方法,在 Python 中覆盖它,并在 C + + 中调用 Python 版本。对于 Cython,它仍然是可行的,但是需要显式地使用 C-PythonAPI。
编辑2017-10-06:
有一个新的 Pybind11,类似于 Boost。但有一些潜在的优势。例如,它使用 C + + 11语言的特性来简化创建新绑定的过程。此外,它是一个只有头文件的库,因此在使用它之前没有任何编译工作,也没有要链接的库。
我玩了一会儿,它确实很简单,使用起来也很舒服。我唯一害怕的就是像布特一样。Python 可能会导致较长的编译时间和较大的库。我还没有做任何基准测试。
我过去用过 PyCxxhttp://cxx.sourceforge.net/,我发现它非常好。
它以一种非常优雅的方式包装了 pythoncAPI,并使其非常易于使用。 用 c + + 编写 python 扩展是非常容易的。它提供了清晰的例子,所以很容易开始。
我真的很喜欢使用这个图书馆,我确实推荐它。
我们在产品中非常成功地使用了 大口喝。
基本上 swig 使用您的 C + + 代码并在其周围生成一个 python 包装器。
这取决于您的可移植性需求。我已经为此苦苦挣扎了一段时间,最后我用 Python API直接包装了我的 C + + ,因为我需要一些可以在管理员只是拼凑了一个大部分工作的 gcc 和 python 安装的系统上工作的东西。
理论上是升压。Python 应该是一个非常好的选择,因为 Boost (几乎)无处不在。不幸的是,如果您最终使用的操作系统安装了较旧的 违约 python (我们的协作被2.4卡住了) ,那么如果您尝试运行 Boost,就会遇到问题。Python 的新版本(我们都使用 Python 2.6)。由于您的管理员可能不愿意安装与每个 python 版本对应的 Boost 版本,因此您必须自己构建它。
因此,如果您不介意在代码运行的每个系统上可能需要一些 Boost 设置,请使用 Boost。巨蟒。如果您想要的代码肯定可以在任何使用 Python 和 C + + 编译器的系统上工作,请使用 PythonAPI。
另一种有趣的方法是通过运行 python 本身来解析 c + + 头文件来生成 python 代码。现在他们已经做了完全相同的事情,使 Java 包装器的 OpenCV 库。我发现这创建了更清晰的 PythonAPI,而没有某个库造成的限制。
我建议大家看看 PyTorch 是如何进行集成的。