获取包含lua文件的路径

rad*_*man 17 filesystems lua

我想知道是否有办法获取当前正在执行的lua脚本文件的路径?

这特别不是当前的工作目录,可能完全不同.我知道luafilesystem会让我获取当前的工作目录,但它似乎无法告诉当前正在执行的脚本文件.

谢谢

编辑:我没有从标准命令行解释器运行,我正在通过luabind从C++二进制文件执行脚本.

ant*_*ore 15

这是一种更优雅的方式:

function script_path()
   local str = debug.getinfo(2, "S").source:sub(2)
   return str:match("(.*/)")
end

print(script_path())
Run Code Online (Sandbox Code Playgroud)

  • 要在Windows上使这个工作替换`str:match("(.*/)")`和`str:match("(.*[/ \\])")` (2认同)

Tar*_*aro 8

我发现的最短形式如下所示:

debug.getinfo(1).source:match("@?(.*/)")
Run Code Online (Sandbox Code Playgroud)

索引 1、2-其他 - 取决于您要查询调用堆栈中的哪个函数。1 是最后调用的函数(您所在的位置)。如果你在全局上下文中运行,那么可能 2 更合适(我自己没有测试过)


lhf*_*lhf 6

如果Lua脚本由标准命令行解释器运行,那么请尝试arg[0].

  • @radman:不.而且,`dofile`使用它获得的任何路径,因此相对路径相对于进程的当前工作目录.如果你想跟踪给'dofile`的文件,你可以重新定义它. (3认同)

Dou*_*rie 5

正如 lhf 所说:

~ e$ echo "print(arg[0])" > test.lua
~ e$ lua test.lua
test.lua
~ e$ cd /
/ e$ lua ~/test.lua
/Users/e/test.lua
/ e$ 
Run Code Online (Sandbox Code Playgroud)

这是使用 debug.getinfo 机制的相同信息

~ e$ echo "function foo () print(debug.getinfo(1).source) end; foo()" > test.lua
~ e$ lua test.lua
@test.lua
~ e$ cd /
/ e$ lua ~/test.lua
@/Users/e/test.lua
/ e$ 
Run Code Online (Sandbox Code Playgroud)

这可以从 C API lua_getinfo 获得