Lua相对路径需求

5
我正在编写一个Lua脚本,试图在与主脚本相同的目录中使用require加载一个文件。但是我似乎无法使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]: ?

我已经尝试了各种路径如"?.lua;"和"./?.lua;"等对解决方案2进行变化,但都没有成功。

你的进程的当前工作目录是什么? - Alexander Gladysh
lua.exe - require 会相对于当前工作目录查找文件,就我所知。 - Alexander Gladysh
虽然我可以设置工作目录,但最终它将在 .NET 应用程序中运行,所以我需要能够查找脚本所在的目录。 - Lance
2
所以在运行脚本之前,只需将路径添加到package.path中即可。 - moteus
这个回答解决了你的问题吗?在Lua中从相对路径引用文件是否有更好的方法? - midrare
显示剩余3条评论
3个回答

2
这两行错误信息为您解释了问题的一些原因:

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中。

工作目录问题与代码无关,完全取决于主机侧(lua.exe或其启动器或嵌入式宿主应用程序)。如果脚本路径发生变化怎么办?正确的方法是:a)运行前进行cd操作;b)使用特定的加载器(如果嵌入式)。 - user3125367

0

我还在学习Lua,但是我可以为您提供以下内容,如果您没有安装文件系统API,则可以创建一个字符串变量,并将当前工作目录添加到其中,如下所示:

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

这就是我所做的,而且我没有遇到任何问题


1
这看起来一点也不实用。如果将脚本移动到另一个目录、另一台机器或同一台机器上的另一个用户,它就会出问题。这并没有解决问题,因为路径变成了绝对路径,而不是相对路径。 - user137369

0

如果您的意思是希望能够从任何目录调用程序,并且它可以正确地定位所需的文件,那么您可以使用以下解决方案(仅需要在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设为全局变量,这样如果需要的话其他模块也可以使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接