python - 有没有办法从 python 类生成 C++ 类并将其绑定(bind)到编译时间?

标签 python c++

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

例如,如果我有这个 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++ 中使用的地方,假设“魔法”将绑定(bind)这两个项目(在运行时(我怀疑可以在没有字符串比较的情况下完成)或在编译时(中间步骤在编译项目之前生成 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 位、操作系统和开发的软件)。

最佳答案

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

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

如果您不喜欢使用 SWIG 等工具,也可以使用 Boost.Python对于 C++。同样,这是用于 Python 绑定(bind)的 C++,不会从 Python 自动生成 C++。

关于python - 有没有办法从 python 类生成 C++ 类并将其绑定(bind)到编译时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20953718/

相关文章:

c++ - 关于 Boost::Python 和 Boost::Threads 的问题

python、pandas、数据框、行到列

python - MySQL 连接器不工作 | Django 1.10 | window | Python 3.5

python - 如何使用 pybind11 从 C++ 调用 python 函数?

c++ - 你为什么要使用引用而不是原始的?

c++ - 如何让 gcc 报告未定义、未使用的外部符号的错误

python - Flask 每个蓝图错误页面

python - 如何计算 Python 中的元音和辅音?

java - 三星 S9+ 和 RenderScript 内在函数

C++ STL 类集 - 编译器错误错误 C2664