如何在Lua 5.1上的包路径上读取数据文件?
我正在寻找的是io.read
,但是在包目录而不是工作目录(arg[0]
),而不使用硬编码的绝对路径。这就像dofile
那样,但没有运行代码,只能将其作为字符串读取。
示例:
我有一个test
文件夹,test.lua
脚本的当前工作目录。
在luapackage
环境变量中指定的另一个文件夹中有一个包LUA_PATH
。
luapackage
可以:
require("luapackage.other_module")
; dofile("other_module.lua")
。但luapackage
无法做到:
io.read("data.txt")
io.read("luapackage/data.txt")
样本结构:
+-test/
|
+-test.lua
+-luamodule/
|
+-data.txt
|
+-luamodule.lua
|
+-other_module.lua
对于此示例,test.lua
仅需要luamodule
:
-- test.lua
local luamodule = require("luamodule")
并且luamodule
需要读取其模块和数据文件:
-- luamodule.lua
local other_module= dofile("other_module.lua") -- works
-- local other_module= require("luamodule.other_module") -- also works
local data = io.open("data.txt") -- fails
-- local data = io.open("luamodule/data.txt") -- also fails
它不起作用,因为它在工作目录(test
)而不是包目录中搜索文件。
如果我将包的副本放在正在运行的脚本文件夹中,则可以io.read(luapackage/data.txt)
。但是每个脚本都必须携带自己的本地副本luapackage
。
注意:我正在寻找Lua解决方案,避免可能影响交叉兼容性的二进制包。
答案 0 :(得分:1)
您可以使用debug.getinfo(1,"S").source
获取当前(模块)文件的位置。将luamodule.lua
替换为data.txt
,删除前导@
,您应该获得所需的路径。