有几个软件包可以帮助自动完成在C \ C ++和其他语言之间编写绑定的任务。
在我的情况下,我想绑定Python,这些包的一些选项是:SWIG,Boost.Python和Robin。
似乎直接的过程是使用这些包来创建C \ C ++可链接库(主要是静态函数),并使用它们扩展更高的语言。
但是,我的情况是我已经在C ++中开发了一个工作系统,因此计划将Python嵌入到它中,以便将来的开发工作在Python中。
我不清楚如何以及如果可能的话,使用这些包来帮助扩展嵌入式Python,使得Python代码能够与已在系统中运行的各种Singleton实例进行交互,并实例化C ++类并与它们进行交互。
我正在寻找的是关于最适合这种情况的设计的见解。
答案 0 :(得分:2)
Boost.python让你可以立即做很多事情,特别是如果你使用智能指针。您甚至可以从Python继承C ++类,然后将这些类的实例传递回您的C ++代码,并使一切仍然有效。关于如何做各种事情的我最喜欢的资源是这个(特别是查看“如何”部分):http://wiki.python.org/moin/boost.python/。
如果您使用智能指针或侵入式指针,Boost.python特别好,因为它们透明地转换为PyObject引用计数。此外,它非常擅长使工厂函数看起来像Python构造函数,这使得Python API非常干净。
如果您没有使用智能指针,它仍然可以执行您想要的所有操作,但您必须处理各种返回和生命周期策略,这会让您头疼。
答案 1 :(得分:1)
简而言之:有现代的替代pybind11。
长版:我还必须嵌入python。 C ++ Python界面很小,所以我决定使用C Api。结果证明这是一场噩梦。公开类可以编写大量复杂的样板代码。 Boost :: Python通过使用可读的接口定义极大地避免了这种情况。但是我发现boost缺少一个复杂的文档,还有一些东西你还需要调用Python api。他们的构建系统似乎给人们带来了麻烦。我不知道因为我使用系统提供的包。最后我尝试了boost python fork pybind11并且不得不说它非常方便并修复了一些提升的缺点,比如使用Python Api的必要性,使用lambdas的能力,缺少易于理解的文档和自动异常翻译。此外它只是标题,并没有拉动部署的巨大提升依赖性,所以我可以明确地推荐它。