【问题标题】:Lua global variable containing path to current file?Lua全局变量包含当前文件的路径?
【发布时间】:2014-02-20 09:54:38
【问题描述】:

Lua 中是否有一个全局变量包含当前正在解释的文件的路径?类似于 Python 的 __file__ 变量?

我在解释器中快速运行for k, v in pairs(_G) do print(k) end,看看是否能找到任何东西。只列出了以下变量?

string xpcall package tostring print os unpack require getfenv setmetatable next assert tonumber io rawequal collectgarbage getmetatable module rawset math debug pcall table newproxy type coroutine _G select gcinfo pairs rawget loadstring ipairs _VERSION dofile setfenv load error loadfile

关于如何获取当前正在执行的文件的路径有什么建议吗?

【问题讨论】:

  • 这将返回启动 Lua 时使用的文件名,但是,它不会返回“当前文件”,它会随require 命令而改变。
  • 请注意,arg 表仅在通过lua 命令行解释器运行脚本时可用。

标签: module lua filesystems filenames interpreter


【解决方案1】:

调试库有一个可以调用的getinfo 方法,除其他外,它可以返回函数的源文件。

local info = debug.getinfo(1,'S');
print(info.source);

这将在调用堆栈的第一级返回函数的源文件名(以@符号开头,表示它是一个文件名)。通过传递1,您正在询问有关当前函数的信息。如果您传入0,它将返回=[C],因为它将返回有关getinfo 函数本身的信息。

有关更多详细信息,请查看 Lua 官方网站上的 Programming in Lua 参考: http://www.lua.org/pil/23.1.html

【讨论】:

  • 这完全可行,但假设有两件事:1) debug 库在运行它的 Lua 版本中可用。 2) 正在运行的代码没有经过调试信息的预编译(例如,使用luac -s)。这些事情都不总是在脚本作者的控制之下。
  • +1 对于我应该在原始答案中指出的非常有效的观点。感谢您的澄清!
  • 还要注意loadstring等函数可以将值设置为任意字符串。
  • 这就是为什么我确实提到文件名将以@ 开头,否则如果使用loadstring,那么源实际上将包含传递给loadstring 的源。
  • 您可以将块名称作为第二个参数传递给 loadstring。例如:loadstring("foo()", "@/this/file/doesnt/exist")。这就是require 设置源文件的方式。
【解决方案2】:

在 Lua 5.2 中,当通过 require 加载脚本时,它接收给 require 的模块名称和 require 用于打开脚本的文件名作为参数:

$ cat a.lua
require"b"
$ cat b.lua
print("in b",...)
$ lua a.lua
in b    b   ./b.lua

在 Lua 5.1 中,只传递模块名,不传递文件名。

【讨论】:

    【解决方案3】:

    回复lhf:
    作为 Lua 的新手,我最初对 ... 的含义感到困惑。原来它是一个可变参数,就像 ANSI C:https://www.lua.org/manual/5.3/manual.html#3.4。根据我使用 lua 5.3 的经验,使用

    local packageName, packagePath = ...
    

    得到我在 require 中使用的包名和包的绝对文件路径。

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 2013-04-18
      • 1970-01-01
      相关资源
      最近更新 更多