2010-09-23 31 views
8

我对C++非常陌生,而且遇到了一个我无法通过阅读文档解决的问题。将脚本语言集成到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. 填补它,我加载外部Python功能,可以说“my_python_function”,即取该结构作为参数并在返回之前与它进行数学运算。
  3. 我得到我的结构像i = my_python_function_cppwrapper(i)

是类似的东西可能吗?我google了很多,但我似乎找到的唯一东西是提供C++ - > python(或其他方式)functionallity的包装,没有真正与变量交互。

我会非常感谢任何帮助,
罗宾。

+0

为什么不使用Boost.Python?它的作品,并会让你做到你想要的。 – wilx 2010-09-23 16:43:10

回答

8

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

+0

非常感谢您,这正是我一直在寻找的。当我查看Boost.Python时,我一定错过了该部分。 – Robin 2010-09-24 07:27:09

2

如何嵌入JavaScript引擎,如V8

+0

我认为我坚持使用python,但我可能会在下一个项目中使用V8。感谢提示,我能想到的唯一的javascript引擎是spidermonkey。 – Robin 2010-09-24 07:28:26

6

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

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

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

+0

这对我来说不太合适,因为我需要传递和提取变量,但感谢您的评论:) – Robin 2010-09-24 07:27:47

1

不要忘记嵌入式脚本语言的盛大爸爸 - tcl。

TCL为V很不错的C++包装(仿照Boost.Python的),这使得它微不足道的调用和回调线了你的代码

1

Lua中工作得也很好,特别是因为它的小,是ANSI C兼容,拥有较低的内存足迹以及出色的维基和消息列表。如果你需要更高的速度,那么就有一个x86 32位和64位jit版本(luajit)。绑定可以通过一系列工具/库来完成,比如swig或者月球(wiki将它们全部列出)。我可以看到的唯一问题是绑定结构成员,以便它们可以直接引用(即:struct.member = 4),尽管可以使用获取和设置方法绑定到变量名称的metatable来设置它。

1

你说你不想在Python接口中包装你的C++函数/类,但是如果你希望Python代码能够引用C++ my_integers结构的成员,那么将C++类包装到一个Python界面。当然,你可以随心所欲地包装尽可能多或者更少的班级 - 在这个例子中,你会打包my_integers,然后你会embed a Python interpretermy_integers的东西。

1

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

1

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

但取决于应用程序,我仍然建议Lua。