如何使用Python和/或Lua创建一个令人讨厌的C++程序?

Man*_*uel 12 c++ python lua binding scriptable

我面临着用户编写可编写脚本的C++应用程序的任务.该应用程序已经开发了几年,之前没有人浪费过这个想法.它包含各种细节,如多线程,模板向导和多重继承.作为脚本语言,Python是首选,但如果它更容易实现,则可能会接受Lua.

问题1

从我到目前为止所学到的,大致上有两种方法可以将Python/Lua与C++集成:"扩展"和"嵌入".

在这种情况下,看起来我需要两者.脚本语言需要从应用程序访问对象,方法和数据,但一旦用户编写脚本,就需要由应用程序调用 - 无需重新启动任何内容.

这通常是如何在现实世界中完成的?

问题2

似乎有一系列令人眼花缭乱的手动解决方案和绑定生成器,所有这些都不够完美.

  • swig,pyste,Py ++,ctypes,Boost.Python sip,PyCXX,pybindgen,robin,(Cython/Pyrex,Weave)
  • CppLua,Diluculum,Luabind,Luabridge,LuaCpp,Luna/LunaWrapper,MLuaBind,MultiScript,OOLua,SLB,Sweet Lua,lux(此列表来自lua wiki)
  • CPB,tolua,tolua ++,toLuaxx,luna和再次swig

网上发现的大部分内容都有些过时了.例如,据说swig在非平凡的情况下很难并且生成难以理解的代码.OTOH,它最近已经进入v2.0.

上面的一些使用pygccxml让gcc分析C++代码然后生成绑定.我发现这个想法很有吸引力,因为gcc可能比我更了解代码:-).这效果好吗?

对它们进行全部测试可能很容易花费我为整个项目分配的时间的一半.

那么,你推荐哪些?

zvr*_*rba 12

我不推荐swig,因为在复杂的情况下很难让它产生令人满意的绑定:在那里,做到了.我不得不写一个可怕的脚本,"解析"原始C++代码,生成一些可接受的C++代码,swig可以咀嚼并生成可接受的绑定.所以,一般来说:避免任何依赖于解析原始C++程序的解决方案.

在Lua和Python之间:我已经找到了Lua MUCH,更好的文档和更干净的实现.Python有一个GIL(全局锁),而对于Lua,你可以在每个线程中有一个解释器实例.所以,如果你可以选择,我会推荐Lua.它是更小的语言,更容易理解,更容易嵌入(更清洁和更小的API,具有出色的文档).我已经将luabind用于我的一个小项目,并发现它易于使用.

  • GIL代表全球**翻译**锁定.如果您有单独的口译员,我不会看到GIL如何相关,除非您想要在每个口译员内部进行线程化. (6认同)
  • @detly这是来自Python的C API文档http://docs.python.org/c-api/init.html的引用"全局解释器锁也由所有线程共享,无论它们属于哪个解释器." (2认同)