如何在Lua 5.1

时间:2017-02-14 03:38:27

标签: lua luajit

如何在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解决方案,避免可能影响交叉兼容性的二进制包。

1 个答案:

答案 0 :(得分:1)

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