【问题标题】:How to check if a script is included via dofile() or run directly in Lua? [duplicate]如何检查脚本是否通过 dofile() 包含或直接在 Lua 中运行? [复制]
【发布时间】:2012-01-31 12:54:25
【问题描述】:

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

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

if __name__ == "__main__":
    main()

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

dofile('foo.lua')之前在主脚本文件中定义一些虚拟全局变量总是有一种简单(而且丑陋)的方式,如果它被定义或者没有被定义,那么它会很棒,但如果有的话那就太好了一种更好的方法。

【问题讨论】:

  • 你是对的,抱歉重复...

标签: lua


【解决方案1】:

在顶层你可以检查debug.getinfo(2)是否为nil

来自http://www.lua.org/manual/5.1/manual.html#pdf-debug.getinfo

你可以给一个数字作为function的值,表示该函数运行在给定线程的调用栈的function层级:level 0是当前函数(getinfo本身);级别 1 是调用 getinfo 的函数;等等。如果 function 的数量大于活动函数的数量,则 getinfo 返回 nil。

【讨论】:

  • 对于任何直接从嵌入代码运行的函数,这也会返回true
  • 这就是我认为 OP 正在有效检查的内容:是否直接调用此脚本(或者如果通过 require/dofile/loadfile/loadstring/etc 加载)
  • 我使用的是 5.2.3,看来我需要检查 debug.getinfo(3) 而不是 2
  • 我得到了相同的结论@dimo414 - 也许是因为我们都在if 中使用了它,它向堆栈添加了另一个函数。
【解决方案2】:

没有。 Lua 无法判断脚本是否被“直接”调用。

记住:Lua 和 Python 的存在目的不同。 Python 专为命令行脚本而设计。您编写一个脚本,它调用可能用 Python、C++ 或其他语言编写的模块。 Python 脚本最终负责何时调用哪些代码。

Lua 首先是一种嵌入式脚本语言。虽然您当然可以使用独立的lua.exe 解释器来创建命令行脚本,但这有点儿麻烦。该语言的主要目的是嵌入某些用 C、C++ 或其他语言编写的应用程序中。

因此,没有“主”脚本的概念。您如何定义什么是“主要”,什么不是?如果 C 代码可以随时出于任何目的加载任何脚本,其中哪一个是“main”?

如果你想定义这个概念,它相当简单。只需将其粘贴在“主”脚本的顶部即可:

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 可能不起作用)。

【讨论】:

  • 我没有对你投反对票,但我想把 Lua 的任何用法都称为 kludge,但嵌入可能是原因。我同意它在嵌入时确实很出色,它本身作为脚本语言也非常有用。
猜你喜欢
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 2011-01-17
  • 2021-02-19
相关资源
最近更新 更多