c++ - 如何使用 Python 和/或 Lua 编写可编写脚本的讨厌的 C++ 程序?

标签 c++ python binding lua scriptable

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

问题 1

根据我目前所了解的,大致有两种方法可以将 Python/Lua 与 C++ 集成:“扩展”和“嵌入”。

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

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

问题 2

那里似乎有一系列令人眼花缭乱的手动解决方案和绑定(bind)生成器,它们都不够完美。

  • 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 在非平凡的情况下很困难,并且会生成难以理解的代码。 OTOH,最近到v2.0了。

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

测试所有这些可能很容易花费我为整个项目分配的一半时间。

那么,你推荐哪些?

最佳答案

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

在 Lua 和 Python 之间:我发现 Lua 好多了,好多了,文档更好,实现也更干净。例如,Python 有一个 GIL(全局锁),而使用 Lua,您可以在每个线程中拥有一个解释器实例。 所以,如果你可以选择,我会推荐 Lua。它是更小的语言,更容易理解,更容易嵌入(更简洁和更小的 API,具有出色的文档)。我在我的一个小项目中使用了 luabind,发现它很容易使用。

关于c++ - 如何使用 Python 和/或 Lua 编写可编写脚本的讨厌的 C++ 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3299067/

相关文章:

python - 使用 Tweepy 返回并保存 800 条 friend 的推文

python - 使用 Selenium Scraper 删除符号 (Python)

WPF 并将 ToolTip 绑定(bind)到 DisplayAttribute

C++/Linux 如何获取其他用户的读取权限统计信息?

c++ - 如何在 C++ 中使用 libiconv 将 ISO-8859-1 转换为 UTF-8

c++ - 函数模板重载解析困惑

c++ - __forceinline 的执行速度是否比 __inline 快?

Python seaborn facetGrid : Is it possible to set row category label location to the left

binding - 如何让 Resharper 将 Specflow Bindings、Step Def 等注释视为隐式使用

eclipse - 我怎样才能治愈... cvc-elt.1 : Cannot find the declaration of element 'jaxb:bindings'