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

How to read a data file at a package path on Lua 5.1

如何在 Lua 5.1 上读取包路径中的数据文件?

我正在寻找的是类似 io.read 的东西,但在包目录而不是工作目录 (arg[0]) 中,并且没有使用硬编码的绝对路径。这就像 dofile 所做的那样,但是没有 运行 代码,只能将其作为字符串读取。

例子:

我有一个 test 文件夹,test.lua 脚本的当前工作目录。

另一个文件夹中有一个包 luapackage,在 LUA_PATH 环境变量指定的某个位置。

luapackage 可以:

但是luapackage做不到:

示例结构:

+-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 解决方案,避免可能损害交叉兼容性的二进制包。

您可以使用 debug.getinfo(1,"S").source 获取当前(模块)文件的位置。将 luamodule.lua 替换为 data.txt,删除前导 @,您应该会得到所需的路径。