【问题标题】:How to call a program from Lua如何从 Lua 调用程序
【发布时间】:2018-09-12 04:36:09
【问题描述】:

我有一个来自游戏的嵌入式 Lua 实例,没有外部 DLL 支持。 我想从 Lua 调用一个程序,它会创建第二个 Lua 实例。 我的问题是如何在 Lua 中调用任何程序? 我认为“os.execute()”解决方案会很糟糕(某些机器上的 os.library 受限)。

【问题讨论】:

  • 意识到,即使您可以调用外部程序(听起来像是游戏开发者已禁用),它也不会与游戏关联。因此,任何未内置到股票 lua.exe 的功能都将不可用。

标签: lua call


【解决方案1】:

您无需启动另一个 Lua 实例即可运行另一个 Lua 脚本1。如果你只是想调用另一个 Lua 脚本,你可以使用dofile(filename)。如果您想在另一个环境中(在 5.1 中)执行此操作,您可以执行以下操作:

local f = assert(load(filename)) -- the assert makes the failure case
                                 -- an error
local env = {} --insert whatever globals you want the script to have

setfenv(f, env) --set the script function to execute with the table
                --you have constructed as its environment
f() --Run the script in the constructed environment

如果您确实需要启动另一个程序(例如,不同脚本语言的解释器),则必须使用os.execute()(或io.popen(),另一个库函数,用于捕获衍生程序的输入和输出流,这甚至更多值得限制)。

但是,如果您正在为不删除 os.execute() 的游戏编写脚本,则可以安全地假设该功能将在其他用户的计算机上可用:Lua 环境由嵌入应用程序维护(游戏本身),而不是机器上的任何其他安装。在游戏方面,确实有四种情况下您将无法生成进程:

  1. 游戏的开发者已经从游戏的 Lua 脚本环境中移除了像 os.execute 这样的库函数。在这种情况下,Lua 脚本无法通过设计生成进程:如果仍然可以,那么限制对函数的访问就没有多大意义了。

  2. 游戏在无法生成子进程的操作环境中运行(例如受限的服务器帐户)。在这种情况下,即使游戏想要启动其他程序,它也无法启动,因为它在操作系统级别是被禁止的。

  3. 游戏可移植到多个平台,您需要生成的进程并非在所有目标平台上都可用。

  4. 最终用户已为他们运行的脚本实施了自己的沙箱。在这种情况下,如果用户相信您的脚本对os.execute 的需求足以为其设置例外,则用户可以做出决定。

1:您以这种方式运行的任何脚本都将只有基本的lua 设施,并且与您的父脚本没有连接 - 假设用户甚至拥有独立的 lua 解释器安装在他们的 PATH 中,这在 Windows 游戏环境中不太可能。

【讨论】:

    猜你喜欢
    • 2019-07-30
    • 2012-01-23
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 2016-07-24
    • 2011-02-01
    • 2016-06-24
    相关资源
    最近更新 更多