【问题标题】:How to make an application scriptable in Linux如何在 Linux 中使应用程序可编写脚本
【发布时间】:2010-03-12 15:14:59
【问题描述】:

我用 C++ 编写了一个应用程序,它采用复杂的二进制文件格式并将其转换为人类可读的文本。编辑文本后,您可以将其重新编译回二进制文件格式。

如果应用程序的内部对象模型是可编写脚本的,这将更加有用。在 Windows 上,我会使用 COM 或 .Net 公开对象,但我希望它可以在 Linux 上运行。我可以嵌入一种脚本语言,但这是一项相当大的工作,并且将用户限制在我选择的脚本语言中。理想情况下,我正在寻找某种方式从我的应用程序中公开可编写脚本的 DOM:

  • 广泛支持脚本语言(无需编写特定语言的包装器)
  • 跨平台(但 Linux 支持最重要)
  • 进行中(但这不是必需的)

更多细节:我希望有一个解决方案能够提供与 COM 类似的好处。也就是说,一旦应用程序的内部对象通过 COM 公开,它们就可以被任何脚本语言操作,就像 JavaScript 可以操作 HTML DOM 一样。对象和方法很容易被发现,并且许多 IDE 为您的对象提供自动命令完成功能。客户端的可用性很重要。

【问题讨论】:

    标签: linux scripting


    【解决方案1】:

    通常的方法是公开一些 CLI 命令,并允许用户在用户编写的任何 shell/脚本语言中使用它们;见 f.e. imagemagick,它公开了许多命令来在格式之间转换图像并应用转换。这适用于任何操作系统。

    这也适用于交互式程序,尽管这种情况很少见。您可以使用 D-BUS 接口(它在 GNOME 和 KDE 中越来越流行),尽管它更多地用于处理事件或发送简单命令。您可能想要创建一个交互式或类似守护程序的程序,它公开 D-BUS(甚至简单的基于套接字/管道的)接口,以及一些包装发送命令的简单 CLI 调用,以便接口更简单。请参阅moc/mocp(“控制台播放器上的音乐”)或xmms2。这适用于任何操作系统,但通常需要一些时间来确定不同操作系统的实现细节。

    不要害怕嵌入完整的语言。像LuaGuile 这样的语言被设计成非常易于嵌入并且非常强大。对一种这样的语言进行标准化并不总是一件坏事,因为这意味着用户之间的代码可重用性更高……而且只有当您计划用户将大段代码编写为插件时,该语言才真正重要。

    有一些方法可以使用特殊库将 API 公开给多种脚本语言。您可以阅读有关它们的信息。在这里:Kross@Wikipedia。我对他们没有经验。

    我假设您的程序将是封闭源代码...然后我能看到的最后一个选项是公开某种可供用户 C 程序使用的 API/ABI 接口(例如编译为动态库)。这样,用户将能够为他们想要的任何语言制作包装器,而且他们可以用纯 C 语言编写代码以提高速度。此解决方案可能难以移植,但它为您(和您的用户)提供了灵活性。

    请注意,过度设计脚本性很容易:最好将编程结构留给外部语言,只提供与程序交互的简单方法。我见过将自己的循环工具添加到脚本语言的程序,即使它们没有为用户增加任何价值:f.e.能够一次传递多张图像进行转换,即使它不会加快处理速度。

    【讨论】:

    • 谢谢,我在问题中添加了更多细节。 CLI 不合适,因为数据粒度太细。脚本代码需要能够检查和操作它。我看过的 D-BUS 客户端的接口非常笨拙。您必须进行明确的 D-BUS 调用,而不是简单地在脚本语言中操作对象。 Kross 看起来有点矫枉过正(为什么要嵌入任何东西?),但这是最接近我的想法的答案。 C 接口是可能的,但对于复杂的对象模型来说非常笨重,并且需要大量用于不同语言的粘合代码。
    • 嗯,我不太清楚 COM 是如何工作的。我只能建议你试试Lua;它的开销非常小,它的对象模型非常简单,因此即使您的用户确实需要使用另一种语言,他们也可以使用 Lua API 调用轻松地与您的程序进行交互......然后您可以将 Lua 视为某种类似 COM 的胶水。
    • 我又花了一天时间研究 D-Bus,但它似乎仍然不太合适。 Kross 更好,所以我将其标记为答案。谢谢。
    • +1,反应不错,只提 SWIG 会更好 ;-)
    【解决方案2】:

    您可能会发现D-Bus 很有用。它提供了一个具有激活支持的面向对象的 API。

    【讨论】:

    • 肯定会根据这些需求使用 D-Bus。检查 [fedorahosted.org/d-feet/] 作为检查现有 D-Bus API 和测试您开发的任何 API 的有用工具。
    • 您能推荐一种具有干净 D-Bus 绑定的脚本语言吗?我见过的都是非常低级的。我想要一些可以将 D-Bus 对象视为原生对象并将对象方法调用透明地转换为 D-Bus 方法调用的东西。
    • 不幸的是,它们都非常低级。我同意为此提供透明代理会很好,但我没有看到任何代理。
    • 你知道有一个应用程序通过 D-Bus 公开一个复杂的对象模型,这样我就可以看到它是如何完成的,以及编写它的难易程度(或难易程度)?
    • 让我们在这里看看...在我的系统上,我看到了 hal、NetworkManager、Avahi、bluez... 只需启动 Fedora 或 Ubuntu 系统,您就会看到大约十几个可以戳穿的系统。
    【解决方案3】:

    我不确定您所说的“可编写脚本”是什么意思。您的意思是您希望它具有其他程序/脚本可以访问的外部接口(有点像 API)?如果是,那么我认为您最好的选择是使用套接字(Unix 或 TCP)。它们是跨平台的,并且大多数脚本语言都有某种通过套接字进行通信的方式(我在 Python、PHP 和 Java 中使用过它们)。

    附带说明,如果您决定使用套接字,最好实现某种标准化协议,例如基于 HTTP 的 XML-RPC。这将使您的“API”更易于使用。

    再次,我希望我理解您所说的“可编写脚本”是什么意思。如果没有,请忽略我的回答。

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 2021-05-18
      • 1970-01-01
      • 2010-09-28
      • 2016-08-08
      相关资源
      最近更新 更多