首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现我的C++ api到Python的通用适配器(就像Boost.Python那样)?

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

Stack Overflow用户
提问于 2014-02-16 15:08:53
回答 1查看 366关注 0票数 2

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

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

不幸的是,在我看来,这样做是不可行的。我需要实现一种机制,它允许我在某个地方指定api并使它在Python世界中自动可用。这在很大程度上是Boost.Python提供的一部分。仅仅使用这个库而幸运的想法可能是一个非常合理的想法。

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

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

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

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

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

否则,有人能给出一个提示吗.

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

还有一个进一步的设计目标是值得一提的:如果可能的话,我想将我的api规范与Python特定的东西分离开来。理论上,也应该可以在同一api规范的基础上嵌入JavaScript或其他解释器,而不必碰它。

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

EN

回答 1

Stack Overflow用户

发布于 2014-02-16 21:28:07

Can anybody explain what is the very basic approach of Boost.Python achieving this goal?

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

因此,基本上,Boost.Python实现是一个类型识别和转换系统,它与Python接口,后者完成了繁重的任务。你可以看上去像这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21812961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档