【问题标题】:How do I make a nasty C++ program scriptable with Python and/or Lua? [closed]如何使用 Python 和/或 Lua 编写可编写脚本的讨厌的 C++ 程序? [关闭]
【发布时间】:2011-03-18 23:07:30
【问题描述】:

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

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

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

那么,你推荐哪些?

【问题讨论】:

  • 当实际将这些问题作为 3 个单独的问题发布时效果会更好 - 每种语言一个新的 Q 以获得最佳活页夹。为此,可能已经有重复了。
  • “以前没有人在这件事上浪费过任何想法”——嘿!我参与了一些项目,这些项目显然是由非常节俭的人开发的:)
  • @Georg Fritzsche 我觉得单独的问题可能会不受欢迎,有点像新闻组中的交叉发布。重复:是的,但我找不到太多关于使 user 可编写脚本的具体问题。你知道如何做到这一点(扩展嵌入)的一个简单易懂的例子吗?
  • 这取决于你在说什么语言。单独的问题在这里要好得多 - 它们可能会被不同的人回答,在搜索时更容易找到,......简而言之,越专注越好。 (旁注:@ 后面的空格使通知不起作用,您不需要全名 - 请参阅 here。)

标签: c++ python binding lua scriptable


【解决方案1】:

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

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

【讨论】:

  • GIL 代表全局解释器锁。如果您有单独的解释器,除非您希望在每个解释器中进行线程化,否则我看不出 GIL 的相关性。
  • 我也会选择 Lua。 C API 非常简单。我几乎总是手动创建 Lua 绑定。
  • @detly 这是来自 Python 的 C API 文档docs.python.org/c-api/init.html 的引用“全局解释器锁也由所有线程共享,无论它们属于哪个解释器。”
  • @zcrba - 对,我的立场是正确的。感谢您的参考。
【解决方案2】:

关于问题 1 - 是的,您需要同时做这两件事。

您会将您的应用程序脚本接口暴露给嵌入式解释器,然后该解释器运行相关的用户脚本。

关于嵌入的 Python 手册部分包括 Extending Embedded Python 部分,并且有关于 Lua 类似内容的教程,请参见例如this article。当然,当您决定使用哪种脚本语言和绑定机制时,可能会找到更简单的方法。

【讨论】:

    【解决方案3】:

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

    在 Lua Qt 绑定中使用了类似的方法 - lqt。它使用cpptoxml生成一个包含所有带参数的类和方法的XML文件,并据此生成绑定C++代码。

    真的很好用,生成器可以绑定几乎所有的Qt类和方法,包括虚方法、重载的操作符、选定的模板类、信号/槽机制等。

    虽然它是专门为 Qt 创建的,但它有一个“noqt”模式,在这种模式下它可以用作通用绑定器,不幸的是我没有使用它的经验,所以我不知道绑定你的代码。

    【讨论】:

      【解决方案4】:

      我的经验可能不多,但我认为这至少值得您为此付出的代价;)

      我已经完成了一些基本的“hello world”python 模块,但我无法真正进入 swig - 我正在做的事情似乎有很多开销。当然,它也有可能正好满足您的需求。

      【讨论】:

        【解决方案5】:

        试试 Boost::Python,它有一些与之相关的学习曲线,但在我看来,它是完成这项工作的最佳工具,我们有一个庞大的实时系统,并为 Boost 中的 QA 开发了脚本库: :Python。

        【讨论】:

          猜你喜欢
          • 2011-08-27
          • 1970-01-01
          • 2020-12-24
          • 2010-12-11
          • 1970-01-01
          • 2012-06-08
          • 2010-12-29
          • 2014-10-05
          • 2013-03-31
          相关资源
          最近更新 更多