2014-12-25 341 views
4

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

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”无济于事。

+0

过程的当前工作目录是什么? –

+0

你是指lua exe文件还是脚本文件? lua exe文件位于程序文件(x86)中。该脚本位于单独的文件夹中,如下所示:c:\ lua files \。 – Lance

+0

据我所知,'lua.exe' - require会查找与CWD相关的文件。 –

回答

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

+0

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

1

我仍然在学习LUA但这里的目录是我能掀起你, 如果你没有安装文件系统API,那么你可以在它的CURENT工作目录的字符串变量,你可以添加到像这样

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

多数民众赞成我做什么,我没有问题

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不会自动执行此操作(从2.6版起,Python就会这么做);希望将来能够实施。您也可以使用base_path来引用同一目录中的其他文件。在我的情况下,例如,有在该目录SQLite数据库和程序需要打开它,所以我用这个:

local database_filename = base_path .. 'db.sqlite' 

您也可以base_path一个全球性的,以便它提供给其他模块,如果必要。