如何检查脚本是否包含在dofile()中或直接在Lua中运行?

时间:2012-01-30 10:45:06

标签: lua

  

可能重复:
  “main” function in Lua?

在Python中,您可以检查脚本是否被直接调用(并调用一些函数,如果是,通常用于测试):

if __name__ == "__main__":
    main()

有没有办法在Lua中做同样的事情,以检测它是直接运行(lua foo.lua)还是包含在另一个脚本(dofile('foo.lua'))中。

dofile('foo.lua')之前,在主脚本文件中定义一些虚拟全局变量总是存在琐碎(和丑陋)的方式,如果已定义,则检查foo.lua,但它会是如果有更好的方法可以做到这一点很好。

2 个答案:

答案 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 ++或其他任何东西编写的应用程序中。

因此,

脚本的概念。你如何定义什么是“主要”,什么不是?如果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可能不起作用的原因),它当然不会起作用。