我正在学习C ++,因为它是一个非常灵活的语言。 但是,对于像Twitter,Facebook的,美味及其他互联网的东西,巨蟒似乎是一个更好的解决方案。
是否有可能以C ++和Python集成在同一个项目?
我正在学习C ++,因为它是一个非常灵活的语言。 但是,对于像Twitter,Facebook的,美味及其他互联网的东西,巨蟒似乎是一个更好的解决方案。
是否有可能以C ++和Python集成在同一个项目?
接口Python和C / C ++是不是一件容易的事。
在这里,我复制/粘贴一个以前的答案对前一个问题的不同的方法来编写Python扩展。 拥有Boost.Python的,痛饮,Pybindgen ...
你可以写在C或C扩展自己++与Python的C-API 。
总之一句话:不这样做,除了学习如何做到这一点。 这是非常困难的做是正确的。 你将不得不增加并用手递减引用和编写大量的代码只是为了揭露一个函数,除了极少数的利益。
痛饮 :
亲们:您可以生成许多脚本语言绑定。
缺点:我不喜欢解析器的工作方式。 我不知道他们是否已经取得了一些进展,但在两年前的C ++解析器是相当有限的。 大多数时候,我不得不复制/粘贴我的.h头添加一些%
字符,并给予额外的提示到痛饮解析器。
我还需要应对来自时间Python的C-API,以时间(不那么)复杂的类型转换。
我不使用它了。
Boost.Python的 :
亲们:这是一个非常完整的图书馆。 它可以让你做几乎一切都是可能与C-API,但在C ++。 我从来没有写这个库中的C-API代码。 我还从来没有遇到过的错误,由于库。 代码绑定要么就像一个魅力或拒绝编译。
这也许是最好的解决方案之一,目前可用的,如果你已经有了一些C ++库进行绑定。 但是,如果你只有一个小的C函数来重写,我可能会用用Cython尝试。
缺点:如果你没有,你要使用的bjam(排序的替代之作)的一个预编译的Boost.Python库。 我真的很讨厌的bjam和它的语法。
与BP创建Python库往往会变得肥胖。 它也需要大量的时间对它们进行编译。
PY ++ :它的Boost.Python变得容易。 PY ++采用了C ++解析器读取你的代码,然后自动生成代码Boost.Python的。 您也可以从它的作者一个很大的支持(不,这不是我;-))。
缺点:只是由于Boost.Python的本身的问题。
编辑这个项目看起来停产。 虽然可能仍然工作,可能不如考虑切换。
Pybindgen :
它生成处理的C-API的代码。 您可以描述的函数和类的Python文件,或者让Pybindgen读你的头,并自动生成绑定(为此,它使用pygccxml,一个Python库中写道由PY ++的作者)。
缺点:这是一个年轻的项目,以更小的团队比Boost.Python的。 还有一些限制:你不能暴露自己的C ++异常,则不能使用多重继承你的C ++类。
反正它是值得一试!
耐热玻璃和用Cython :
在这里,你不写真正的C / C ++,但是Python和C之间的混合这中间代码会生成一个常规的Python模块。
编辑2013年7月22日:现在PY ++看起来停产了,我现在正在寻找一个很好的选择。 我目前正在尝试用Cython我的C ++库。 此语是在一个用Cython功能Python和C之间的组合,你可以使用Python或C / C ++实体(函数,变量,对象,...)。
用Cython是非常容易学习,有着非常不错的表现,你甚至可以避开C / C ++完全如果你没有接口的传统C ++库。
然而,对于C ++它配备了一些问题。 这是不太“AUTOMAGIC”比PY ++是,所以它可能是稳定的C ++ API更好(这是现在我的媒体库的情况下)。 我用Cython看到的最大的问题是使用C ++多态性。 随着PY ++ /升压:蟒蛇,我能够在C ++定义虚拟方法,在Python覆盖它,并调用内C ++的Python版本。 随着用Cython它仍然是可行的,但需要明确地使用C-的Python API。
编辑2017年10月6日:
有一个新的, pybind11 ,类似的Boost.Python但也有一些潜在的优势。 例如,它使用C ++语言的11个功能,使其更易于创建新的绑定。 此外,它是一个只有头库,所以没有什么使用它之前进行编译,并没有图书馆链接。
我用它玩一点点,它的确是非常简单和愉快的使用。 我唯一担心的是,像Boot.Python它可能会导致编译时间过长和大型图书馆。 我没有做任何基准呢。
是的,这是可能的,鼓励和证明 。 我已经做到了我自己,发现它是非常容易的。
的Python / C API参考手册 -谁想要写扩展模块或把Python C和C ++程序员使用的API。
扩展和嵌入Python解释器
描述了如何用C或C ++模块与新模块延伸Python解释。 这些模块可以定义新的功能,但也有新的对象类型和他们的方法。 该文件还描述了如何嵌入Python解释器在其他应用程序,用作扩展语言。 最后,它说明了如何编译和链接扩展模块,使得它们可以被动态加载(在运行时)到解释,如果底层操作系统支持该功能。
尝试耐热玻璃 。 使得为Python编写C ++的扩展更加容易。
我们使用痛饮在我们的产品非常成功。
基本上,痛饮需要你的C ++代码,并在其周围产生一个Python包装。
我建议你看PyTorch如何做自己的集成。
看到这一点:
用C或C延伸的Python ++
“这是很容易的新的内置模块添加到Python,如果你知道如何在这样的C.扩展模块进行编程可以做两两件事,不能在Python直接完成:他们可以实现新的内置对象类型,他们可以调用C库函数和系统调用。
为了支持扩展,Python的API(应用程序接口)定义了一组功能,宏和提供访问的Python运行时系统的大多数方面的变量。 Python的API是由包括标题“Python.h”并入C源文件。 “
http://www.python.org/doc/2.5.2/ext/intro.html
PS它的拼写为“整合” :)
我用PyCxx http://cxx.sourceforge.net/在过去,我发现这是非常好的。
它包装在一个非常优雅的方式蟒蛇C API,并使得它非常容易使用。 这是很容易的C ++编写Python扩展。 它具备明显的例子,所以很容易上手。
我已经使用这个库真的很喜欢,我也推荐它。
这取决于您的便携性要求。 我一直在挣扎了一会儿,我结束了我的包裹C ++使用Python的API直接,因为我需要的东西,在哪里管理员只砍死在一起的大多是工作的gcc和Python安装系统的工作原理。
从理论上说Boost.Python的应该是一个非常好的选择,因为升压可用(几乎)无处不在。 不幸的是,如果您在使用旧默认的Python安装OS结束(我们之间的合作是套牢2.4),因此当你试图用较新的版本(大家都使用Python 2.6)上运行的Boost.Python遇到的问题。 由于您的管理员可能没有刻意去安装一个版本对应于每一个Python版本的Boost,你必须建立它自己。
所以,如果你不介意的话可能需要在每个系统上的一些升压设置你的代码运行在使用Boost.Python的。 如果你想代码将使用Python和C ++编译器的任何系统上绝对正常工作,使用Python API。
另一种有趣的方式做的是通过运行Python本身来解析C ++头文件的Python代码生成。 OpenCV的团队成功地采取这种做法,而现在他们已经做了同样的事情做出了OpenCV库Java包装。 我发现,没有造成一定的限制库这创造更清洁的Python API。
您可以编写Python扩展的C ++。 基本上,Python本身是用C写的,你可以用它来打电话到你的C代码。 您可以完全访问您的Python对象。 还检查了Boost.Python的 。