需要 Lua 相对路径

Posted

技术标签:

【中文标题】需要 Lua 相对路径【英文标题】:Lua Relative Path Required 【发布时间】:2015-02-23 02:15:58 【问题描述】:

我正在编写一个 Lua 脚本,并尝试对与主脚本位于同一目录中的文件使用 require。我似乎无法在这种情况下工作,并尝试了几种我找到的解决方案,但似乎都没有。我在一个目录中有以下文件:

main.lua
helper.lua

我尝试了以下解决方案,并在每个解决方案之后都收到了错误:

解决方案 1:

local folderOfThisFile = (...):match("(.-)[^%.]+$") 
local helper = require(folderOfThisFile .. 'helper')

lua: ...domizerWPF\DataFiles\LUA\main.lua:2: attempt to index local 'pathOfThisFile' (a nil value)
stack traceback:
    ...domizerWPF\DataFiles\LUA\main.lua:2: in main chunk
    [C]: ?

解决方案 2:

package.path = "/?.lua;" .. package.path 
local helper = require('helper')

lua: ...domizerWPF\DataFiles\LUA\main.lua:2: module 'helper' not found:
    no field package.preload['helper']
    no file '/helper.lua'
    no file '.\helper.lua'
    no file 'C:\Program Files (x86)\Lua\5.1\lua\helper.lua'
    no file 'C:\Program Files (x86)\Lua\5.1\lua\helper\init.lua'
    no file 'C:\Program Files (x86)\Lua\5.1\helper.lua'
    no file 'C:\Program Files (x86)\Lua\5.1\helper\init.lua'
    no file 'C:\Program Files (x86)\Lua\5.1\lua\helper.luac'
    no file '.\helper.dll'
    no file '.\helper51.dll'
    no file 'C:\Program Files (x86)\Lua\5.1\helper.dll'
    no file 'C:\Program Files (x86)\Lua\5.1\helper51.dll'
    no file 'C:\Program Files (x86)\Lua\5.1\clibs\helper.dll'
    no file 'C:\Program Files (x86)\Lua\5.1\clibs\helper51.dll'
    no file 'C:\Program Files (x86)\Lua\5.1\loadall.dll'
    no file 'C:\Program Files (x86)\Lua\5.1\clibs\loadall.dll'
stack traceback:
    [C]: in function 'require'
    ...domizerWPF\DataFiles\LUA\main.lua:2: in main chunk
    [C]: ?

我尝试了解决方案 2 的变体,其中包含各种路径,例如“?.lua;”和“./?.lua;”无济于事。

【问题讨论】:

您的进程的当前工作目录是什么? 你是指lua exe还是脚本? lua exe 位于程序文件 (x86) 中。该脚本位于一个单独的文件夹中,如下所示:c:\lua files\. lua.exe — 要求查找与 CWD 相关的文件,据我所知。 如果您从命令行运行它,请务必 cd 进入工作目录。如果是快捷方式,请在其属性中设置 workdir。 因此,只需在运行前将带有脚本的路径添加到 package.path 即可。 【参考方案1】:

如果您的意思是您希望能够从任何目录调用程序并且它正确定位required 文件,那么您可以使用此解决方案(您只需要在main.lua 中使用它):

local base_path = string.match(arg[0], '^(.-)[^/\\]*$')
package.path = string.format("%s;%s?.lua", package.path, base_path)

这通过将文件所在的目录添加到包路径中来工作,以便require 可以处理该目录中的文件。 Lua 还没有自动执行此操作(Python 会,从 2.6 版左右开始);希望它会在未来实施。您也可以使用base_path 来引用同一目录中的其他文件。以我为例,该目录中有一个 SQLite 数据库,程序需要打开它,所以我使用这个:

local database_filename = base_path .. 'db.sqlite'

您还可以将base_path 设为全局,以便在必要时可供其他模块使用。

【讨论】:

【参考方案2】:

我仍在学习 lua,但这里是我可以为你准备的, 如果您没有安装文件系统 API,那么您可以在其中创建一个包含当前工作目录的字符串变量,然后您可以像这样添加到它

local cwd="C:\users\user\Desktop\"
dofile(cwd.."program.lua")

这就是我的工作,我没有任何问题

【讨论】:

这看起来一点都不实用。如果您将脚本移动到另一个目录、另一台机器或同一台机器上的另一个用户,它将中断。这并不能解决问题,因为路径是绝对的,而不是相对的。【参考方案3】:

这两行错误消息可以说明您的问题:

no file '/helper.lua'
no file '.\helper.lua'

第一行是由于您对 package.path 的更改。如您所见,它会查找一个不存在的“/helper.lua”文件,因此它什么也不做。第二行是由于默认的 package.path 并在当前工作目录中寻找“helper.lua”。由于没有找到,你当前的工作目录一定不是你的 main.lua 所在的目录。

修复方法是将当前工作目录设置为 main.lua 和 helper.lua 所在的目录,或者将 "C:\\path\\to\\your\\lua\\project\\?.lua" 添加到 package.path 中

【讨论】:

Workdir 问题与代码无关,完全位于主机端(lua.exe 或其启动程序或嵌入主机应用程序)。如果脚本路径发生变化怎么办?正确的方法是:a)运行前 cd,b)使用特定的加载器(如果嵌入)。

以上是关于需要 Lua 相对路径的主要内容,如果未能解决你的问题,请参考以下文章

有没有更好的方法来要求来自 lua 中相对路径的文件

如何打开相对于执行 Lua 文件的 txt 文件?

Unity中lua 的 io.open() 文件路径的问题

LuaCheck功能更新——UWA本地资源检测

Vue项目打包后的资源引用如何使用相对路径

Lua入门 —— 一些常用的琐碎