需要Lua相对路径

时间:2014-12-25 09:02:43

标签: lua require

我正在编写一个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;"无济于事。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我还在学习lua,但这是我能为你鞭打的, 如果您没有安装文件系统API,那么您可以使用您的curent工作目录创建一个字符串变量,并且可以像这样添加它

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

这就是我的所作所为,我没有遇到任何问题

答案 2 :(得分:0)

如果您希望能够从任何目录调用该程序并且它正确找到require d个文件,那么您可以使用此解决方案(您只需要在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设为全局,以便在必要时可供其他模块使用。