我正在开发一个项目,因为我必须用Python包装C ++类才能编写程序脚本。所以我的具体经验还包括在我们的程序中嵌入Python解释器。
我尝试的替代方案是:
Boost.Python的
我喜欢Boost.Python生成的更干净的API,但事实上它需要用户安装额外的依赖项才能让我们切换到SWIG。
SWIG
SWIG对我们的主要优势是它不需要最终用户安装它来使用最终程序。
你曾经做过什么,你有什么经验?
答案 0 :(得分:23)
我已经使用过两者(对于同一个项目):Boost与STL更好地集成,尤其是C ++异常。此外,它的内存管理机制(试图桥接C ++内存管理和Python GC)比SWIG更灵活。但是,SWIG有很多更好的文档,没有外部依赖,如果你把这个库包装在SWIG for Python中,那么获得Java / Perl / Ruby包装的时间已经超过了一半。
我不认为有一个明确的选择:对于较小的项目,我会再次使用Boost.Python,对于更大的长期项目,SWIG的额外投资是值得的。
答案 1 :(得分:18)
答案 2 :(得分:6)
我建议SIP。由于以下原因,SIP优于SWIG:
对于给定的文件集,swig会生成比SIP更多的重复(开销)代码。 SIP通过使用可以静态或动态链接的库文件来管理生成较少的重复(开销)代码。换句话说,SIP具有更好的可扩展性。
SIP的执行时间远远少于SWIG的执行时间。请参阅Python Wrapper Tools: A Performance Study。很遗我有个人副本,可以根据要求分享。
答案 3 :(得分:5)
答案 4 :(得分:2)
Boost :: Python的一大优点是它允许在ipython shell中完成选项卡:你导入一个直接由Boost公开的C ++类,或者你将它子类化,从那时起,它的表现就像一个纯粹的Python类。
缺点:安装和使用Boost需要很长时间,所有Tab-completion省时都不会分期付款; - (
所以我更喜欢Swig:没有花里胡哨,但是在一个简短的介绍性例子之后可靠地工作。