我目前正在从事一个项目,需要使用Python封装C++类以便运行程序。我的特定经验还涉及在我们的程序中嵌入Python解释器。
我尝试过的替代方案是:
Boost.Python
我喜欢使用Boost.Python产生的更清晰的API,但它需要用户安装额外的依赖库,这促使我们转向SWIG。
SWIG
对我们来说,SWIG的主要优点是不需要最终用户安装它即可使用程序。
你用过什么工具来做这个?你的经验如何?
我曾在同一个项目中都使用过Boost和SWIG: Boost更好地与STL以及特别是C++异常集成。此外,其内存管理机制(试图桥接C++内存管理和Python GC)比SWIG的要灵活得多。然而,SWIG有更好的文档、没有外部依赖,如果你获得了用于Python的SWIG库包装,那么你就已经完成了一半以上的工作,可以得到Java/Perl/Ruby的包装。
我认为没有明显的选择:对于较小的项目,我仍会选择Boost.Python,对于更大的长期项目,额外投入SWIG的价值是值得的。
我建议使用SIP。 SIP比SWIG更好,原因如下:
对于给定的文件集,swig生成的重复(开销)代码比SIP多。 SIP通过使用可以静态或动态链接的库文件来生成较少的重复(开销)代码。换句话说,SIP具有更好的可扩展性。
SIP的执行时间比SWIG短得多。请参阅Python Wrapper Tools:性能研究。不幸的是,链接似乎已经失效了。如果需要,我可以分享个人副本。