2009-08-12 105 views
4

我有相当大的C++库支持它,我需要把整个事情变成一个Python扩展几个子库。我正在使用distutils,因为它需要跨平台,但如果有更好的工具,我愿意提供建议。Python的非平凡的C++扩展

有没有办法让distutils的第一编译子库,当它从创建主库扩展的链接呢?

回答

10

我只是在我们的产品中使用了大量的C++库。有几种工具可以帮助您自动完成书写绑定的任务:最流行的是SWIG,这已经有一段时间了,用于很多项目,并且通常效果很好。

反对痛饮最重要的事情(在我看来)是SWIG本身的C++代码库实在是相当这些混沌说得客气一点。它是在STL之前编写的,并且有它自己的半动态类型系统,现在它已经老旧了。这并没有什么大不了,除非你必须陷入困境并对核心进行一些修改(我曾尝试添加doxygen - > docstring转换),但是如果你曾经这么做过,祝你好运!人们还说SWIG生成的代码效率不高,这可能是对的,但对我来说,我从来没有发现SWIG称自己已经足够担心它的瓶颈。

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

这两种工具都需要你做一些工作的前期,以界定什么将被暴露,相当它将如何做。对于SWIG,您提供的界面文件与C++头文件类似,但是已经剥离下来,并提供一些额外的指令来告诉SWIG如何翻译复杂类型等。编写这些界面可能很乏味,因此您可能需要查看类似pygccxml的内容以帮助您自动为你生成它们。

那个包的作者写道:实际上另一部分你可能会喜欢其中:py++。这个软件包有两件事:它可以自动生成绑定定义,然后可以将它们反馈到boost.python来生成python绑定:基本上它是大多数人的完整解决方案。如果您没有遇到任何特殊或困难的要求,您可能想从此开始。

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

您也可以找到绑定生成工具的Python方便this comparison。亚历克斯在评论虽然,其相当老了所指出的,但至少让你的生活的某些想法...

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

+1

请注意,您引用的CERN报告是“这种比较”已超过6年,因此必须使用大粒盐(!)。特别是SIP在这些年已经发展了很多**,所以今天它非常值得考虑。 – 2009-08-12 15:17:37