向Python公开C++ API

Mar*_*ara 40 c++ python swig boost

我目前正在开发一个项目,我必须用Python包装C++类才能编写程序脚本.所以我的具体经验还涉及在我们的程序中嵌入Python解释器.

我尝试的替代方案是:

  • Boost.Python的

    我喜欢Boost.Python生成的更干净的API,但事实上它需要用户安装额外的依赖项才能让我们切换到SWIG.

  • 痛饮

    SWIG对我们的主要优势是它不需要最终用户安装它来使用最终程序.

您曾经做过什么,以及您的经历是什么?

Max*_*mus 23

我使用过两者(对于同一个项目):Boost与STL更好地集成,特别是C++异常.此外,它的内存管理机制(试图桥接C++内存管理和Python GC)比SWIG更灵活.但是,SWIG有很多更好的文档,没有外部的依赖关系,如果你包裹在SWIG为Python库你比那里得到一个Java/Perl的/ Ruby包装器,以及中途更多.

我不认为有一个明确的选择:对于较小的项目,我会再次使用Boost.Python,对于更大的长寿项目,SWIG的额外投资是值得的.


ori*_*rip 18

编辑 - 罗宾项目遗憾地被遗弃,今天用得不多

我用罗宾取得了巨大的成功.

与C++类型的集成,并创建一个单一的.cpp文件编译,并在您共享对象.


bha*_*dra 6

我建议使用SIP.由于以下原因,SIP优于SWIG:

  1. 对于给定的文件集,swig生成比SIP更多的重复(开销)代码.SIP通过使用可以静态或动态链接的库文件来管理生成较少的重复(开销)代码.换句话说,SIP具有更好的可扩展性.

  2. SIP的执行时间远远少于SWIG的执行时间.参考Python包装工具:性能研究.很遗 我有个人副本,可以根据要求分享.

  • 该返回机器有一份副本:http://web.archive.org/web/20070703071726/http://people.web.psi.ch/geus/talks/europython2004_geus.pdf (4认同)

Ton*_*uža 5

pyrexcython也是混合这两个世界的好方法.

使用这些工具包装C++比包装C有点棘手但可以完成.是关于它的维基页面.