我有一个没有外部DLL支持的游戏中的嵌入式Lua实例.我想从Lua调用一个程序,它创建了第二个Lua实例.我的问题是如何调用Lua中的任何程序?我认为"os.execute()"解决方案会很糟糕(在某些机器上限制了os.library).
Stu*_*ley 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
Run Code Online (Sandbox Code Playgroud)
如果你真的需要启动另一个程序(比如说,另一个脚本语言的解释器),你不能不使用os.execute()(或者io.popen()另一个库函数来捕获衍生程序的输入和输出流,这是更多的限制 -值得).
但是,如果您正在为不能删除的游戏编写脚本os.execute(),则可以安全地假设该函数将在其他用户的计算机上可用:Lua环境由嵌入应用程序(游戏本身)维护而不是任何在机器上的其他安装.说到游戏,实际上有四种情况你无法生成进程:
该游戏的开发人员已经os.execute从游戏的Lua脚本环境中删除了库函数.在这种情况下,Lua脚本无法按设计生成进程:如果仍然可行,则限制对函数的访问没有多大意义.
游戏在无法生成子进程(例如受限制的服务器帐户)的操作环境中运行.在这种情况下,游戏即使在想要的情况下也无法启动其他程序,因为它在操作系统级别是禁止的.
游戏可以移植到多个平台,并且您需要生成的进程并非在所有目标平台上都可用.
最终用户已经为他们运行的脚本实现了自己的沙箱.在这种情况下,用户可以决定是否相信脚本的需要os.execute足以为其制作例外.
1:您将以这种方式运行的任何脚本只具有基本lua功能,并且没有与父脚本的连接 - 假设用户甚至lua安装了独立解释器并且在其PATH中,这在Windows游戏环境中是不可能的.