集成 Python 和 C + +

我学习 C + + 是因为它是一种非常灵活的语言。但对于 Twitter、 Facebook、 Delicious 等互联网应用而言,Python 似乎是一个更好的解决方案。

有可能将 C + + 和 Python 集成到同一个项目中吗?

116367 次浏览

你可以用 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..。

编辑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 是如何进行集成的。