将C++ API暴露给Python
我现在在做一个项目,需要把C++的类包装成Python可以用的,这样才能用Python来编写程序。所以我还需要把Python解释器嵌入到我们的程序里。
我尝试过的替代方案有:
Boost.Python
我觉得Boost.Python提供的接口很干净,但因为用户还需要安装额外的依赖项,所以我们决定换用SWIG。
SWIG
对我们来说,SWIG的主要优点是它不需要最终用户安装它就能使用最终的程序。
你们用过什么方法来实现这个?使用的体验如何?
5 个回答
7
我推荐使用SIP。SIP比SWIG更好,原因有以下几点:
对于一组文件,SWIG生成的重复代码(也就是多余的代码)比SIP要多。SIP通过使用一个可以静态或动态链接的库文件,成功地减少了重复代码的生成。换句话说,SIP的扩展性更好。
SIP的执行时间远低于SWIG。可以参考Python Wrapper Tools: A Performance Study。不过这个链接似乎坏掉了。如果需要,我可以分享我个人的副本。
18
23
我在同一个项目中用过这两种工具:Boost和SWIG。Boost和标准模板库(STL)结合得更好,特别是在处理C++的异常时。此外,Boost的内存管理机制(它试图将C++的内存管理和Python的垃圾回收结合起来)比SWIG的灵活得多。不过,SWIG的文档要好得多,而且没有外部依赖。如果你用SWIG把库包装成Python用的,那你距离把它变成Java、Perl或Ruby用的库也就差不多了。
我觉得没有绝对的选择:对于小项目,我还是会选择Boost.Python;但对于大型、长期的项目,投资SWIG是值得的。