如何为我的C++;Python的api(像Boost.Python那样)? 我用一些类(有一些方法)编写了一个C++程序,我想用Python 3编写脚本。在运行时,程序从某处加载一些Python脚本并执行它。脚本应该能够调用一些我的C++方法来控制程序行为。这可能是一种常见的插件场景

如何为我的C++;Python的api(像Boost.Python那样)? 我用一些类(有一些方法)编写了一个C++程序,我想用Python 3编写脚本。在运行时,程序从某处加载一些Python脚本并执行它。脚本应该能够调用一些我的C++方法来控制程序行为。这可能是一种常见的插件场景,python,c++,boost,Python,C++,Boost,到目前为止,我所做的是嵌入Python的C-API,并手工制作一些PyMethodDef和PyModuleDef的东西。通过创建PyTypeObject实例,我还能够获得完整的类包装 不幸的是,我认为这样做是不可行的。我需要实现一种机制,它允许我在某处指定我的api,并让它在Python世界中自动可用。这在很大程度上是Boost.Python提供的功能的一部分。仅仅使用这个库并幸运的想法可能是非常合理的 然而,我开始尝试自己实现它(因为我不喜欢外部依赖,主要是因为我对学习感兴趣) 不幸的是,到目

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

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

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

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

PyMethodDef
结构需要填充类似于
PyObject**(PyObject*,PyObject*)
函数指针的内容。因此,我似乎必须为我的C++方法提供一个简单的函数(甚至不是一个有利于模板类的方法),它在<代码> PyObjult//Cl> >和本机C++值之间转换,并在某个实例上执行C++方法。 我的第一个想法是编写一个模板类,它以某种方式获取我的本机方法作为模板参数。在第一次运行中,我将实现限制为仅一个特定的方法签名,比如说仅
void*(int)
。我的希望是看看以后如何使它更灵活。但是即使有这个限制,我也无法将有用的东西传递给
PyTypeObject
。我的模板类当然可以有一些实例,但是我只有一个方法,但没有任何东西可以放在函数指针中。静态方法避免了多态性,因此这似乎也不是解决方案

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

否则,有谁能给我一个像

  • 如何设计模板类以使其匹配,或者
  • 如何以智能但简单的方式实现api中的
    void*(int)
    方法之外的更大灵活性,或者
  • 如何以可能完全不同的方式解决问题(避免陷入XY问题^^)
?

还有一个设计目标值得一提:如果可能的话,我想将我的api规范与Python特定的东西解耦。理论上,也可以在同一api规范之上嵌入JavaScript或任何解释器,而无需触摸它


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

有人能解释一下Boost.Python实现这一目标的最基本方法是什么吗?
Python已经有了一个加载
dll
的系统,它们被称为
扩展模块
。Python可以编译源代码来生成一个。编写一个小包装器来声明一个从Python调用的函数,模板元编程魔术有助于检测C++函数所采用和返回的类型,以便它可以发出正确的代码来将这些代码从/转换到等效的Python类型。 因此,基本上Boost.Python实现是一个类型识别和转换系统,它与负责繁重工作的Python C API接口。
你可以看看,例如

也许你应该看看Swig?谢谢,这真的是一种完全不同的方式。也许我以后会辞职,回到那样的事情上去。目前,我尽量不引进这么多额外的设备。因为SWIG似乎需要额外的构建步骤,所以就额外的依赖性而言,这比使用Boost.Python更糟糕。另一方面,这种方法将提供(脚本)语言无关的解决方案,甚至Boost.Python都没有提供这种解决方案。“模板元编程魔术”是我感兴趣的细节。我的程序是可运行的,并且已经通过其C API实现了Python3集成。但是我不想手动编写类的所有包装。相反,我试图了解如何实现“类型识别和转换系统”,就像Boost.Python一样,但这是我自己的想法,而且要简单得多。目前,我甚至在所有类型识别发生之前就失败了,只是因为我看不到一种方法来创建可以提供给
PyMethodDef
结构的函数。我会读你的链接文本。