如何在 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
可以:
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 解决方案,避免可能损害交叉兼容性的二进制包。
您可以使用 debug.getinfo(1,"S").source
获取当前(模块)文件的位置。将 luamodule.lua
替换为 data.txt
,删除前导 @
,您应该会得到所需的路径。
如何在 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 解决方案,避免可能损害交叉兼容性的二进制包。
您可以使用 debug.getinfo(1,"S").source
获取当前(模块)文件的位置。将 luamodule.lua
替换为 data.txt
,删除前导 @
,您应该会得到所需的路径。