Lua相对路径需要。

我正在编写一个 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]: ?

我尝试过多种 Solution 2 变体与各种路径,如 "?.lua;" 和 "./?.lua;",但都没有效果。

点赞
用户90511
用户90511

这两行错误信息可以让您更好地了解您的问题:

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。

2014-12-25 15:23:33
用户7480063
用户7480063

我仍在学习lua,但是这是我可以为您准备的,

如果您没有安装文件系统API,则可以使用当前工作目录创建一个字符串变量,并像这样添加:

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

这就是我做的,我没有遇到任何问题。

2017-03-06 18:14:40
用户2428487
用户2428487

如果您的意思是想从任何目录调用程序并且正确定位require的文件,那么您可以使用以下解决方案(只需要在 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设为全局变量,以便在必要时其他模块也可以使用它。

2017-11-27 14:52:16