将C++ API暴露给Python

42 投票
5 回答
13246 浏览
提问于 2025-04-11 19:13

我现在在做一个项目,需要把C++的类包装成Python可以用的,这样才能用Python来编写程序。所以我还需要把Python解释器嵌入到我们的程序里。

我尝试过的替代方案有:

  • Boost.Python

    我觉得Boost.Python提供的接口很干净,但因为用户还需要安装额外的依赖项,所以我们决定换用SWIG。

  • SWIG

    对我们来说,SWIG的主要优点是它不需要最终用户安装它就能使用最终的程序。

你们用过什么方法来实现这个?使用的体验如何?

5 个回答

7

我推荐使用SIP。SIP比SWIG更好,原因有以下几点:

  1. 对于一组文件,SWIG生成的重复代码(也就是多余的代码)比SIP要多。SIP通过使用一个可以静态或动态链接的库文件,成功地减少了重复代码的生成。换句话说,SIP的扩展性更好。

  2. SIP的执行时间远低于SWIG。可以参考Python Wrapper Tools: A Performance Study。不过这个链接似乎坏掉了。如果需要,我可以分享我个人的副本。

18

更新 - Robin项目可惜已经停止维护,现在用处不大了。

我曾经使用过Robin,效果非常好。

与C++类型的结合非常顺畅,并且会生成一个单独的.cpp文件,方便你编译并包含到你的共享对象中。

23

我在同一个项目中用过这两种工具:Boost和SWIG。Boost和标准模板库(STL)结合得更好,特别是在处理C++的异常时。此外,Boost的内存管理机制(它试图将C++的内存管理和Python的垃圾回收结合起来)比SWIG的灵活得多。不过,SWIG的文档要好得多,而且没有外部依赖。如果你用SWIG把库包装成Python用的,那你距离把它变成Java、Perl或Ruby用的库也就差不多了。

我觉得没有绝对的选择:对于小项目,我还是会选择Boost.Python;但对于大型、长期的项目,投资SWIG是值得的。

撰写回答