2014-12-25 268 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一個全球性的,以便它提供給其他模塊,如果必要。