可能重复:
“main” function in Lua?
在Python中,您可以检查脚本是否被直接调用(并调用一些函数,如果是,通常用于测试):
if __name__ == "__main__":
main()
有没有办法在Lua中做同样的事情,以检测它是直接运行(lua foo.lua
)还是包含在另一个脚本(dofile('foo.lua')
)中。
在dofile('foo.lua')
之前,在主脚本文件中定义一些虚拟全局变量总是存在琐碎(和丑陋)的方式,如果已定义,则检查foo.lua
,但它会是如果有更好的方法可以做到这一点很好。
答案 0 :(得分:9)
在顶层,您可以检查debug.getinfo(2)
是否为
来自http://www.lua.org/manual/5.1/manual.html#pdf-debug.getinfo
你可以给一个数字作为函数的值,这意味着在给定线程的调用堆栈的level函数上运行的函数:level 0是当前函数(getinfo本身); level 1是调用getinfo的函数;等等。如果function是一个大于活动函数数的数字,则getinfo返回nil。
答案 1 :(得分:3)
没有。 Lua无法判断脚本是否“直接”调用。
请记住:Lua和Python存在用于不同目的。 Python专为命令行脚本而设计。您编写了一个脚本,该脚本调用可能用Python,C ++或其他任何东西编写的模块。 Python脚本最终负责在何时调用哪些代码。
Lua是一种嵌入式脚本语言,首先是。虽然您当然可以使用独立的lua.exe
解释器来创建命令行脚本,但这仍然是一个问题。该语言的主要目的是嵌入一些用C,C ++或其他任何东西编写的应用程序中。
因此,是
如果你想定义这个概念,那就相当简单了。只需将它放在“主要”脚本的顶部:
do
local old_dofile = dofile
function new_dofile(...)
if(__is_main) then
__is_main = __is_main + 1
else
__is_main = 1
end
old_dofile(...)
__is_main = __is_main - 1
if(__is_main == 0) then __is_main = nil end
end
dofile = new_dofile
end
当然,这对于require
加载的任何内容都不起作用;您还需要为require
编写此版本。如果外部代码使用C-API加载函数(这就是require
可能不起作用的原因),它当然不会起作用。