有没有一种方法可以从python类生成一个c++类,并在编译时将其绑定
Is there a way to generate a c++ class from a python class and bind it a compile time?
有没有办法从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
让我们称它们为obj1
和obj2
。假设你有一个设定器:
setIntX(self):
self.x = 5
假设你还有一个设定器:
setStringX(self):
self.x = "5"
那么,在您的C++类中,成员x的类型是什么
这只能在运行时决定,并且为一个python类建模可能需要多个C++类
然而,python中的模板类可能是可行的,而且实际上非常有趣
也可能不可能有一个通用的解决方案,但如果您假设没有成员具有不明确的类型,这是可能的。
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- C++绑定(已弃用)
- 运行时错误:引用绑定到类型为"int"的空指针
- 有没有办法将重载的类函数绑定到函数对象?
- 替换 C++17 中移除的绑定 1st