繁体   English   中英

Python非平凡的C ++扩展

[英]Python non-trivial C++ Extension

我有相当大的C ++库,有几个支持它的子库,我需要把整个东西变成python扩展。 我正在使用distutils因为它需要跨平台,但如果有更好的工具我会接受建议。

是否有办法使distutils首先编译子库,并在从主库创建扩展时链接它们?

我在我们的产品中使用了一个庞大的C ++库。 有几种工具可以帮助您自动完成编写绑定的任务:最受欢迎的是SWIG ,它已经存在了很长一段时间,用于很多项目,并且通常运行良好。

反对SWIG的最大的事情(在我看来)是SWIG本身的C ++代码库本身相当苛刻。 它是在STL之前编写的,并且拥有自己的半动态类型系统,现在只是陈旧而吱吱作响。 这并不重要,除非你不得不陷入困境并对核心进行一些修改(我曾经试图添加doxygen - > docstring转换),但如果你曾经这样做,祝你好运! 人们还说SWIG生成的代码不是那么有效,这可能是真的,但对我来说,我从未发现SWIG自称是足以成为担心瓶颈的瓶颈。

如果SWIG没有漂浮您的船,还可以使用其他工具: boost.python也很受欢迎,如果您已经在C ++代码中使用了boost库,那么它可能是一个不错的选择。 缺点是它在编译时间很重,因为它几乎都是基于c ++模板的。

这两个工具都要求您预先做一些工作,以便定义将要公开的内容以及如何完成。 对于SWIG,你提供的接口文件就像C ++标题但是被剥离了,还有一些额外的指令告诉SWIG如何翻译复杂类型等。编写这些接口可能很乏味,所以你可能想看看像pygccxml这样的东西来帮助你自动生成它们。

该软件包的作者实际上编写了另一个您可能喜欢的扩展名: py ++ 这个包做了两件事:它可以自动生成绑定定义,然后可以将其提供给boost.python以生成python绑定:基本上它是大多数人的完整解决方案。 如果您没有特别或困难的要求,您可能想要从那里开始。

其他一些可能有用的参考问题:

您也可以找到Python方便的绑定生成工具的比较 正如亚历克斯在评论中指出的那样,它现在相当古老,但至少让你对景观有所了解......

关于如何驱动构建,你可能想要看一个更高级的内置工具,如果你想坚持使用Python,我会强烈推荐Waf作为框架(其他人会告诉你SCons是要走的路,但是相信我这很慢......我已经去过那里了!)......这需要一点点学习,但是当你了解它时它是非常强大的。 而且由于它是纯Python,它将与构建过程中的任何其他Python代码完美集成(例如,最后使用Py ++)...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM