如何在Lua 5.1的包路径下读取数据文件

如何在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") -- 可以工作
-- local other_module= require("luamodule.other_module") -- 也可以工作

local data = io.open("data.txt") -- 失败
-- local data = io.open("luamodule/data.txt") -- 也失败

它不起作用,因为它在工作目录(test)而不是包目录中搜索文件。

如果我将包的副本放置在运行脚本的文件夹中,则可以使用io.read(luapackage/data.txt)。但每个脚本都必须携带自己的本地副本luapackage

注:我正在寻找一种Lua解决方案,避免可能影响跨兼容性的二进制包。

点赞
用户1442917
用户1442917

你可以使用 debug.getinfo(1,"S").source 来获取当前(模块)文件的位置。将 luamodule.lua 替换为 data.txt,移除开头的 @,然后你就能得到你需要的路径。

2017-02-14 07:58:31