我是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 ++代码的情况下更改数学。
我正在考虑这样的代码结构:
i = my_python_function_cppwrapper(i)
这样的事情可能吗?我搜索了很多东西,但我似乎唯一能找到的包装提供c ++ - > python(或其他方式)functionallity没有真正与变量交互。
我真的很感谢任何帮助,
罗宾。
答案 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。