我有一个没有外部DLL支持的游戏中的嵌入式Lua实例。 我想从Lua调用一个程序,它创建了第二个Lua实例。 我的问题是如何调用Lua中的任何程序? 我认为“os.execute()”解决方案会很糟糕(在某些机器上限制了os.library)。
答案 0 :(得分:11)
您无需启动另一个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环境由嵌入应用程序维护(游戏本身)而不是机器上的任何其他安装。说到游戏,实际上有四种情况你无法产生进程:
游戏开发者已从游戏的Lua脚本环境中删除了os.execute
等库函数。在这种情况下,Lua脚本无法按设计生成进程:如果仍然可行,则限制访问函数没有多大意义。
游戏在无法生成子进程(例如受限制的服务器帐户)的操作环境中运行。在这种情况下,即使想要,游戏也无法启动其他程序,因为它在操作系统级别被禁止。
游戏可移植到多个平台,并且您需要生成的进程并非在所有目标平台上都可用。
最终用户已经为他们运行的脚本实现了自己的沙箱。在这种情况下,如果用户相信您的脚本需要os.execute
足以对其进行例外处理,则用户可以做出决定。
1 :您将以这种方式运行的任何脚本只有基本的lua
工具并且没有与父脚本的连接 - 假设用户甚至安装了独立的lua
解释器并在其PATH中,这在Windows游戏环境中是不可能的。