在 C++ 中扩展嵌入式 Python - 设计与 C++ 实例交互

Posted

技术标签:

【中文标题】在 C++ 中扩展嵌入式 Python - 设计与 C++ 实例交互【英文标题】:Extending embedded Python in C++ - Design to interact with C++ instances 【发布时间】:2011-05-11 14:03:01 【问题描述】:

有几个包可以帮助自动编写 C\C++ 和其他语言之间的绑定任务。

就我而言,我想绑定 Python,此类包的一些选项是:SWIG、Boost.Python 和 Robin。

似乎直接的过程是使用这些包来创建 C\C++ 可链接库(大部分是静态函数)并使用它们扩展高级语言。

但是,我的情况是我已经用 C++ 开发了一个工作系统,因此计划将 Python 嵌入其中,以便未来的开发将在 Python 中。

我不清楚如何(如果可能的话)使用这些包来帮助扩展嵌入式 Python,使 Python 代码能够与系统中已经运行的各种 Singleton 实例进行交互,并实例化 C++ 类并与之交互。

我正在寻找的是关于最适合这种情况的设计的见解。

【问题讨论】:

【参考方案1】:

Boost.python 让您可以直接执行很多此类操作,尤其是在您使用智能指针的情况下。您甚至可以从 Python 中的 C++ 类继承,然后将这些实例传递回您的 C++ 代码并让一切正常工作。我最喜欢的关于如何做各种事情的资源是这个(特别是查看“如何做”部分):http://wiki.python.org/moin/boost.python/。

如果您使用智能指针或侵入式指针,Boost.python 特别好,因为它们可以透明地转换为 PyObject 引用计数。此外,它非常擅长使工厂函数看起来像 Python 构造函数,这使得 Python API 非常简洁。

如果你不使用智能指针,你仍然可以做你想做的所有事情,但你必须搞砸各种退货和终身政策,这会让你头疼。

【讨论】:

【参考方案2】:

简而言之:有现代替代品 pybind11。

长版:我还必须嵌入 python。 C++ Python 接口很小,所以我决定使用 C Api。结果证明这是一场噩梦。暴露类可以让你编写大量复杂的样板代码。 Boost::Python 通过使用可读的接口定义极大地避免了这种情况。然而,我发现 boost 缺乏复杂的文档,并且做一些你仍然需要调用 Python api 的东西。此外,他们的构建系统似乎给人们带来了麻烦。我不知道,因为我使用系统提供的软件包。最后我尝试了 boost python fork pybind11,不得不说它真的很方便,并且修复了 boost 的一些缺点,比如必须使用 Python Api、能够使用 lambdas、缺乏易于理解的文档和自动异常翻译.此外,它只是标题,不会对部署产生巨大的提升依赖性,所以我可以明确推荐它。

【讨论】:

以上是关于在 C++ 中扩展嵌入式 Python - 设计与 C++ 实例交互的主要内容,如果未能解决你的问题,请参考以下文章

[ZT]C++ 扩展和嵌入 Python

使用 c++ 对象的全局实例扩展嵌入式 python 解释器

从 C++ 应用程序中的嵌入式 Python 调用时,多数组扩展库上的 Numpy 导入失败

C++ python 扩展数组大小问题 (C2133)

python能做啥?

将 Java 嵌入到 C++ 应用程序中?