我正在编写一个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;"无济于事。
答案 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
设为全局,以便在必要时可供其他模块使用。