有没有办法从python类生成一个c ++类并将其绑定到编译时?

时间:2014-01-06 15:50:17

标签: python c++

有没有办法从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 methods”范例而不是类属性。

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

我希望用户只需要输入两次资源名称:一次在python类中,一次在c ++中使用资源的地方,假设“魔法”将要绑定这两个项目(在运行时(我怀疑可以在没有字符串比较的情况下完成)或在编译时(中间步骤在编译项目之前生成c ++类))。这就是我从python到c ++的原因;我相信从c ++到python需要至少2个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,因此编译时需要cpython api库。

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

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

3 个答案:

答案 0 :(得分:1)

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

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

如果您不喜欢使用SWIG等工具,那么C ++也有Boost.Python。同样,这是用于Python绑定的C ++,并且不会从Python自动生成C ++。

答案 1 :(得分:0)

您可以在C ++代码中使用embed python,反之亦然。虽然有点难看,但是有很多辅助函数可以非常强大并且可以完成你想要的任务,但我不确定我是否完全理解你的问题。这不需要cython api,但仍然需要Python.h。

答案 2 :(得分:0)

按照你的要求做一个合乎逻辑的问题 Python的类型很弱。
在python中,甚至可以在运行时更改某个数据成员的类型 所以说你有两个类型为

的对象
CarDef

让我们称呼他们obj1obj2。 假设你有一个二传手:

setIntX(self): 
    self.x = 5

并且假设你也有一个二传手:

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

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