gpt4 book ai didi

python - 如何为我的 C++ api 实现通用适配器到 Python(就像 Boost.Python 那样)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:01 26 4
gpt4 key购买 nike

我已经用一些类(有一些方法)制作了一个 C++ 程序,我想用 Python3 编写脚本。在运行时,程序从某处加载一些 Python 脚本并执行它。这些脚本应该能够调用我的一些 C++ 方法来控制程序行为。大概,这是一个常见的插件场景。

到目前为止,我所做的是嵌入 Python 的 C-API 并手工制作一些 PyMethodDefPyModuleDef 东西。我还能够通过创建 PyTypeObject 实例来获得完整的类包装器。

不幸的是,在我看来,以这种方式进行下去似乎并不可行。我需要实现一种机制,它允许我在某处指定我的 api 并使其在 Python 世界中自动可用。这在很大程度上是 Boost.Python 提供的功能的一部分。只使用这个库并幸运的想法可能是一个非常合理的想法。

但是,我开始尝试自己实现它(因为我不喜欢外部依赖,主要是因为我对学习很感兴趣)。

不幸的是,到目前为止我的成功并不值得一提,因为每个想法似乎都陷入了死胡同:-/

PyMethodDef 结构需要填充类似PyObject* *(PyObject*,PyObject*) 函数指针的内容。所以我似乎必须为我的每个 C++ 方法提供一个简单的函数(甚至不是一些有利的模板化类的方法),它在 PyObject 和 native C++ 值之间转换并执行 C++ 方法在某个实例上。

我的第一个想法是编写一个模板类,它以某种方式将我的 native 方法作为模板参数。在第一次运行中,我将实现限制为只有一个特定的方法签名,可以说只有 void*(int)。我希望以后能看到如何使它更灵活。但即使有这个限制,我也无法将有用的东西传递给 PyTypeObject。我的模板类当然可以有一些实例,但是我只有一个方法,但我不能把任何东西放在函数指针中。静态方法规避了多态性,因此这似乎也不是解决方案。

谁能解释一下 Boost.Python 实现这个目标的最基本方法是什么?到目前为止,阅读代码和手册都没有给出任何想法,因为它实际上所做的远远超过我想要的。我会限制我的 api 只使用 bool、int、一些字符串表示和指向其他 api 对象的指针作为参数和返回值。我不需要大多数额外的魔法,比如异常翻译等等。我想要一个 KISS 解决方案。

否则,任何人都可以给出提示,例如...

  • 如何设计我的模板类以使其匹配,或者
  • 如何以一种聪明而简单的方式在 api 中实现比仅使用 void*(int) 方法更大的灵 active ,或者
  • 如何以可能完全不同的方式解决问题(避免陷入 XY 问题 ^^)

?

还有一个设计目标值得一提:如果可能的话,我想将我的 api 规范与特定于 Python 的内容分离。从理论上讲,也应该可以在相同的 api 规范之上嵌入 JavaScript 或任何解释器,而无需触及它。

我越来越怀疑我的某些部分目标很难实现,但我希望这里有人至少能给出一些新的思路。

最佳答案

谁能解释一下 Boost.Python 实现这个目标的最基本方法是什么?

Python已经有了加载dll的系统,它们被称为扩展模块。 Boost.Python 可以编译源代码来生成一个。您编写一个小包装器来声明一个可从 Python 调用的函数,模板元编程魔术有助于检测 C++ 函数采用和返回的类型,以便它可以发出正确的代码,将这些类型与等效的 Python 类型进行转换。

基本上,Boost.Python 实现是一个类型识别和转换系统,它与承担繁重工作的 Python C API 接口(interface)。你可以看看例如here

关于python - 如何为我的 C++ api 实现通用适配器到 Python(就像 Boost.Python 那样)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21812961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com