如何使用导出的类型从C ++调用Python脚本

时间:2018-09-08 22:25:18

标签: python c++

首先,让我从为什么要做我想问的事情开始。我正在研究一个本质上将是模拟引擎的C ++应用程序,并且我希望通过Python使它的行为可编写脚本,以便我可以创建自定义模拟,而无需更改或重新编译任何C ++代码。

我已经进行了一些研究,找到了使用Python C API从C ++调用Python代码的方法。我还看到了使用Boost.Python将C ++类型导出到Python的示例(似乎是首选方法)。我不是Boost的忠实拥护者,如果可能的话,我希望远离Boost.Python。从我看过的所有内容来看,二进制文件的大小会膨胀,Boost本身是一个巨大的依赖项(Boost 1.68在下载和构建后,占用了超过1.5 GB的空间),而我对其中95%的内容都不感兴趣。 / p>

我所看到的关于这些简单方法的所有示例似乎都只解决一种方式。我需要将我的C ++类型公开给我的python脚本,但是随后我想从我的C ++应用程序中调用这些脚本,而我不确定如何同时执行这两种操作。

所以说我有一些用C ++定义的类型。

Types.h

struct Vector3
{
    double x;
    double y;
    double z;

    Vector3() : x(0.0), y(0.0), z(0.0) {}
    Vector3(double x, double y, double z) : x(x), y(y), z(z) {}
};

Vector3 operator + (const Vector3& lhs, const Vector3& rhs)
{
    return Vector3(lhs.x+rhs.y, lhx.y+rhs.y, lhs.z+rhs.z);
}

class Object
{
public:
    Object(const std::string& name) : _name(name) {}

    const std::string& name() const {return _name;}

    void setPosition(const Vector3& pos) {_pos = pos;}
    const Vector3& position() const {return _pos;}

    void setVelocity(const Vector3& vel) {_vel = vel;}
    const Vector3& velocity() const {return _vel;}

private:
    std::string _name;
    Vector3 _pos;
    Vector3 _vel;
};

然后我有一个Python脚本来更新对象的位置。

SampleMover.py

import MyLib

def moveObject(object):
    pos = object.position
    vel = object.velocity
    object.setPosition(pos + vel)

在我的C ++应用中,我想做这样的事情。

Test.cpp

void testScript()
{
  Object* object = new Object("Test Object");
  object->setVelocity(Vector3(4.0, 1.0, 0.0));

  Script* script = loadScript("SampleMover.py");
  if (script)
  {
    script->call("moveObject", object);
  }
}

所有这些代码都完全代表了我要完成的工作。我了解实际的实现方式可能会有所不同,具体取决于所使用的工具。但是希望您能想到我想在Python脚本中使用在C ++应用程序中定义的类型,这些类型又从C ++应用程序中调用。

我的假设是,我需要在一个单独的共享库中定义要公开的任何类型,然后可以将这些脚本导入Python脚本,并且我的C ++应用程序也将加载该共享库。

任何建议将不胜感激。

0 个答案:

没有答案