首先,让我从为什么要做我想问的事情开始。我正在研究一个本质上将是模拟引擎的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 ++应用程序也将加载该共享库。
任何建议将不胜感激。