包含当前文件路径的Lua全局变量?

Str*_*s3D 6 filesystems lua filenames interpreter module

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

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

Pai*_*Pol 7

调试库有一个getinfo可以调用的方法,它可以返回函数的源文件等.

local info = debug.getinfo(1,'S');
print(info.source);
Run Code Online (Sandbox Code Playgroud)

这将返回调用堆栈第一级函数的源文件名(将以@符号开头,表示它是文件名).通过1你要求提供有关当前功能的信息.如果你传入0它将返回,=[C]因为它将返回有关getinfo函数本身的信息.

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

  • 这完全有效,但假设有两件事:1)`debug`库在它运行的Lua的构建中可用.2)正在运行的代码尚未预先编译,并且调试信息被剥离(例如,使用`luac -s`).这些东西都不在脚本作者的控制之下. (6认同)

lhf*_*lhf 7

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

$ cat a.lua
require"b"
$ cat b.lua
print("in b",...)
$ lua a.lua
in b    b   ./b.lua
Run Code Online (Sandbox Code Playgroud)

在Lua 5.1中,只传递模块名称,而不是文件名.


小智 5

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

local packageName, packagePath = ...
Run Code Online (Sandbox Code Playgroud)

为我提供了在 require 中使用时的包名和包的绝对文件路径。