有没有一种方法可以从python类生成一个c++类,并在编译时将其绑定

Is there a way to generate a c++ class from a python class and bind it a compile time?

本文关键字:c++ 绑定 一个 编译 方法 一种 有没有 python      更新时间:2023-10-16

有没有办法从python类生成一个相对干净的c++类,并在编译时绑定它?

例如,如果我有这个python类:

class CarDef:
acceleration = 1000.0
brake = 1500.0
inertia = acceleration * 0.1 * brake
def __init__(self):
pass

我想要相应的c++类:

class CarDef
{
public:
double acceleration;
double brake;
double inertia;
CarDef() 
: acceleration( 1000.0 )
, brake( 1500.0 )
, inertia ( 150000.0 )
{};
};

产生的c++类和原始python类可能不同:我可以使用"getter方法"范式而不是类属性。

我试图实现的是在python中创建资源文件,以便在我的c++应用程序中使用。目标是尽可能减少最终用户为添加和使用参数而必须编写的代码量;并且它必须避免在"运行阶段"进行字符串比较(在"初始化阶段"允许)。

我希望用户只需输入两次资源名称:一次在python类中,一次在c++中使用资源的地方,假设"魔术"将绑定这两个项(要么在运行时(我怀疑这可以在没有字符串比较的情况下完成),要么在编译时(中间步骤在编译项目之前生成c++类)。这就是我从python到c++的原因;我认为,从c++到python至少需要两个python文件:一个是生成的,另一个是从后者继承的(以避免覆盖已经指定的资源)。

最终用户的使用情况如下:

// A singleton definition manager
class DefManager
{
CarDef mCarDef;
public:
static DefManager& GetReference() 
{
static DefManager instance;
return instance;
}
CarDef& getCarDef() { return mCarDef; }
};
// One would use the generated CarDef class like this:
mCar.setSpeed( mCar.getSpeed() +  DefManager.GetReference().getCarDef().acceleration );

考虑到这一点,python代码严格地在c++代码之外。

我看到的一个明显的问题是如何知道python属性或方法返回的类型。我看到了一些Cython的例子,它似乎能够使用类型(这太棒了!),但我还没有看到任何它可以做我需要的事情的例子。此外,c生成的代码在编译时似乎仍然需要Python.h,因此也需要cpythonapi库。

我有什么办法可以做到这一点吗?有更好的方法吗?

  • 我使用的是python 3.2+
  • 我正在使用MS Visual Studio 2010(我们计划很快升级到2013)
  • 我使用的是32位系统(但我们计划很快升级到64位,操作系统和开发的软件)

从C++到Python有一种方法,但我不知道从Python到C++有什么方法。如果您不介意先用C++编写代码,可以使用SWIG工具为您自动生成Python类。

请注意,异常处理有一些限制。您可以设置为让Python代码抛出C++异常,但异常类型可能会在翻译中丢失。您还需要注意对引用计数对象的处理。SWIG将为Python生成引用计数,这有时会意外地生成delete对象。

如果你不喜欢使用SWIG这样的工具,还有Boost.Python for C++。同样,这是用于Python绑定的C++,不会从Python自动生成C++。

您可以在C++代码中嵌入python,反之亦然。有很多辅助函数,虽然有点难看,但功能非常强大,可能能够实现您想要的,尽管我不确定我是否完全理解您的问题。这不需要cythonAPI,但仍然需要Python.h

按要求行事存在逻辑问题
Python是弱类型的
在python中,甚至可以在运行时更改某个数据成员的类型
假设您有两个类型的对象

CarDef

让我们称它们为obj1obj2。假设你有一个设定器:

setIntX(self): 
self.x = 5

假设你还有一个设定器:

setStringX(self): 
self.x = "5"

那么,在您的C++类中,成员x的类型是什么
这只能在运行时决定,并且为一个python类建模可能需要多个C++类
然而,python中的模板类可能是可行的,而且实际上非常有趣
也可能不可能有一个通用的解决方案,但如果您假设没有成员具有不明确的类型,这是可能的。