代码之家  ›  专栏  ›  技术社区  ›  rogueg

Python非平凡C++扩展

  •  4
  • rogueg  · 技术社区  · 15 年前

    我有相当大的C++库和几个支持它的子库,我需要把整个事情变成一个Python扩展。我之所以使用distutils,是因为它需要跨平台,但如果有更好的工具,我愿意接受建议。

    有没有一种方法可以让distuils首先编译子库,并在它从主库创建扩展时将它们链接起来?

    1 回复  |  直到 15 年前
        1
  •  10
  •   Community CDub    7 年前

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

    对SWIG最大的反对(在我看来)是,SWIG本身的C++代码库真的相当粗糙。它是在STL之前编写的,并且拥有自己的半动态类型系统,而现在这个系统已经过时了。这没什么大不了的,除非你不得不陷入其中并对核心做一些修改(我曾经尝试添加doxygen->docstring转换),但如果你曾经这样做过,祝你好运!人们还说,Swig生成的代码没有那么高效,这可能是真的,但对我来说,我从未发现Swig调用本身就足以成为一个瓶颈,让我担心它。

    如果Swig不让你的船漂浮,你还可以使用其他工具: boost.python 如果你已经在C++代码中使用了Boost库,那么它也是一个很好的选择。缺点是它在编译时很重,因为它几乎都是基于C++模板的。

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

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

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

    你也可以找到 this comparison 用于Python的绑定生成工具。正如亚历克斯在评论中指出的,它现在已经相当古老了,但至少给了你一些风景的概念…

    在如何驱动构建方面,您可能希望看到一个更高级的构建工具distutils:如果您想坚持使用python,我强烈推荐 Waf 作为一个框架(其他人会告诉你 SCons 是要走的路,但相信我,这太慢了:我已经去过那里又回来了!)…这需要一点学习,但是当你头脑清醒的时候,它是非常强大的。而且由于它是纯Python,因此它将与作为构建过程一部分的任何其他Python代码完美集成(例如,最后使用py++)。

    推荐文章