我目前正在做一个项目,我必须用 Python 包装 C++ 类才能编写程序脚本。所以我的具体经验还涉及在我们的程序中嵌入 Python 解释器。
我尝试的替代方案是:
Boost.Python
我喜欢 Boost.Python 生成的更简洁的 API,但它需要用户安装额外的依赖项这一事实使我们切换到 SWIG。
痛饮
SWIG 对我们来说的主要优势是它不需要最终用户安装它来使用最终程序。
你以前做过什么,你有什么经验?
我已经使用了两者(对于同一个项目):Boost 与 STL 更好地集成,尤其是 C++ 异常。此外,它的内存管理机制(试图桥接 C++ 内存管理和 Python GC)比 SWIG 更灵活。但是,SWIG 具有更好的文档,没有外部依赖项,并且如果您将库包装在 SWIG for Python 中,那么您也可以获得 Java/Perl/Ruby 包装器的一半以上。
我不认为有一个明确的选择:对于较小的项目,我会再次使用 Boost.Python,对于较大的长期项目,对 SWIG 的额外投资是值得的。
我建议SIP。由于以下原因,SIP 优于 SWIG:
对于给定的一组文件,swig 生成的重复(开销)代码比 SIP 多。SIP 通过使用可以静态或动态链接的库文件来设法生成更少的重复(开销)代码。换句话说,SIP 具有更好的可扩展性。
SIP 的执行时间远小于 SWIG。请参阅Python 包装器工具:性能研究。不幸的是,链接似乎已损坏。我有一份个人副本,可应要求共享。
Boost::Python 的一大优点是它允许在 ipython shell 中完成制表符:您导入一个由 Boost 直接公开的 C++ 类,或者您将其子类化,从那时起,它的行为就像一个纯 Python 类。
缺点:安装和使用 Boost 需要很长时间,以至于所有 Tab 完成时间节省都不会摊销;-(
所以我更喜欢 Swig:没有花里胡哨的东西,但在一个简短的介绍性示例之后可以可靠地工作。