将脚本语言集成到C ++应用程序中

时间:2010-09-23 16:17:24

标签: c++ python scripting embedding

我是C ++的新手,我遇到了一个我无法通过阅读文档来解决的问题。

我想在我的c ++应用程序中嵌入一个脚本语言。该语言可以是javascript,lua或者最好是python。

我不是在寻找像Boost.Python / swig这样的东西,它能够将我的c ++函数/类包装到python接口,而是一个python_evaluate_and_return_result_as_variable("my_code");函数。

我有一大堆包含几个整数的结构:

struct my_integers {
    int a;
    int b;
    int c;
    int d;
    int e;
};

现在我想用这些整数做一些数学运算,例如:

i.a = i.c * i.e;

我想要做的数学将来会发生很大变化,我需要其他人才能在不访问c ++代码的情况下更改数学。

我正在考虑这样的代码结构:

  1. 我初始化我的结构并用起始值
  2. 填充它
  3. 我加载了一个外部python函数,让我们说“my_python_function”,它将struct作为参数,并在返回之前对其进行数学运算。
  4. 我的结构如i = my_python_function_cppwrapper(i)
  5. 这样的事情可能吗?我搜索了很多东西,但我似乎唯一能找到的包装提供c ++ - > python(或其他方式)functionallity没有真正与变量交互。

    我真的很感谢任何帮助,
    罗宾。

9 个答案:

答案 0 :(得分:8)

Python文档在C或C ++应用程序的embedding Python上有一个页面。

答案 1 :(得分:8)

为什么不使用Boost.Python?您可以将数据类公开给Python并按照here所述执行脚本/函数。

答案 2 :(得分:6)

如果您只想从C / C ++运行Python脚本,请使用the Python C API。在您的C / C ++代码中:

PyRun_SimpleString("import math; x = math.sqrt(2 * 2)");

对于更复杂的事情,您将不得不查看API文档,但它非常简单。

答案 3 :(得分:2)

如何嵌入JavaScript引擎,例如V8

答案 4 :(得分:1)

不要忘记嵌入式脚本语言的祖父 - tcl。

tcl有一个很好的c ++包装器(在boost.python上建模),这使得调用和连接回调代码变得微不足道

答案 5 :(得分:1)

Lua的效果非常好,特别是因为它很小,符合ansi c,内存占用率低,并且有很棒的wiki和消息列表。如果你需要更高的速度,有一个x86 32和64位jit版本(luajit)。绑定可以使用一系列工具/库来完成,例如swig或lunar(wiki将它们全部列出)。我能看到的唯一问题是绑定结构成员,以便可以直接引用它们(即:struct.member = 4),尽管可以使用metatables设置它,getmet和set方法绑定到变量名

答案 6 :(得分:1)

你说你不是在寻找在Python界面中包装你的C ++函数/类的东西,但如果你希望Python代码能够引用你的C ++ my_integers结构的成员,那么< em>是在Python接口中包装C ++类。当然,您可以自由地包装任意数量的类 - 在此示例中,您将包装my_integers,然后您embed a Python interpreter执行{{1}的操作}。

答案 7 :(得分:1)

对于您描述的简单内容,您可以为自己的“小语言”实现解释器。你甚至可以称之为“罗宾”语言。 ; - )

答案 8 :(得分:1)

我建议使用 Lua 作为内部脚本引擎。实现只是几行,虽然很轻,但语言有足够的能力。所以不需要TCL。你可以看看python,在C ++中集成相当容易,因为存在一个促进集成的 Boost.Python 实现。

但根据申请,我仍然会推荐Lua。