如何从Lua调用程序

如何从Lua调用程序,lua,call,Lua,Call,我有一个来自游戏的嵌入式Lua实例,没有外部DLL支持。 我想从Lua调用一个程序,它创建第二个Lua实例。 我的问题是如何调用Lua中的任何程序? 我认为os.execute解决方案在某些机器上可能是受限制的os.library。您不需要启动另一个Lua实例来运行另一个Lua脚本1。如果您只想调用另一个Lua脚本,可以使用dofilefilename。如果要在5.1中的另一个环境中执行此操作,可以执行以下操作: local f = assert(load(filename)) -- the a

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

您不需要启动另一个Lua实例来运行另一个Lua脚本1。如果您只想调用另一个Lua脚本,可以使用dofilefilename。如果要在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脚本无法通过设计生成进程:如果仍然可行,那么限制对函数的访问就没有什么意义了

游戏运行在一个操作环境中,它不能产生子进程,比如一个受限的服务器帐户。在这种情况下,游戏无法启动其他程序,即使它想启动,因为在操作系统级别是禁止的

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

最终用户已经为他们运行的脚本实现了自己的沙箱。在这种情况下,如果用户信任您的脚本对操作系统的需求,则可以做出决定。请执行足够的命令,以对其进行例外处理


1:以这种方式运行的任何脚本都只有基本lua功能,没有与父脚本的连接-假设用户甚至安装了独立的lua解释器并在其路径中,这在Windows游戏环境中是不可能的。

您不需要启动另一个lua实例来运行另一个lua脚本1。如果您只想调用另一个Lua脚本,可以使用dofilefilename。如果要在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脚本无法通过设计生成进程:如果仍然可行,那么限制对函数的访问就没有什么意义了

游戏运行在一个操作环境中,它不能产生子进程,比如一个受限的服务器帐户。在这种情况下,游戏无法启动其他程序,即使它想启动,因为在操作系统级别是禁止的

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

最终用户已经为他们运行的脚本实现了自己的沙箱。在这种情况下,如果用户信任您的脚本对操作系统的需求,则可以做出决定。请执行足够的命令,以对其进行例外处理


1:以这种方式运行的任何脚本都只有基本lua功能,没有与父脚本的连接-假设用户甚至安装了独立的lua解释器并在其路径中,这在Windows游戏环境中是不可能的。

请意识到,即使您可以调用外部程序,这听起来像是游戏开发者已经禁用了,它不会与游戏相关联。因此,任何没有内置到股票lua.exe中的函数都将不可用。请意识到,即使您可以调用外部程序(听起来游戏开发人员已禁用该程序),它也不会与游戏关联。因此,任何未内置到stock lua.exe的函数都将不可用。