为何Lua 5.4默认无法从当前目录加载模块?
Lua 5.4默认无法从当前目录加载模块的原因
核心原因:跨版本的安全变更,并非5.4独有
Lua从5.2版本开始,就默认从package.path中移除了当前目录(.)的配置,这是官方为避免恶意脚本加载当前目录下的同名恶意模块(比如伪装成标准库的恶意脚本)而做的安全调整,5.4只是延续了这个规则。
为什么旧Stack Overflow答案说默认支持?
那些提及“默认支持当前目录加载”的问答,几乎都是针对Lua 5.1及更早版本的——5.1及之前的默认package.path确实包含当前目录,这也是很多旧资料的认知来源。
Windows下的特殊表现
Windows系统的命令行环境没有Unix类系统那种“当前目录优先级”的隐含规则,因此这个变更的影响更直接:直接调用require("hello")时,Lua会完全按照默认的package.path查找,不会自动搜索当前目录,因此报错找不到模块。
验证方式
你可以在Lua交互模式下输入以下命令查看默认路径:
print(package.path)
输出里不会包含./?.lua或类似当前目录的规则,而你自定义的requireLocal函数本质就是给package.path追加了当前目录的查找规则,所以能成功加载。
常用解决方案
除了自定义加载函数,还有几种常规方式:
- 在脚本开头临时修改路径:
package.path = package.path .. ";./?.lua" - 设置系统环境变量
LUA_PATH,添加./?.lua(Windows下注意用分号分隔路径) - 命令行启动时指定路径:
lua -e "package.path='./?.lua;'..package.path" use_hello.lua
内容的提问来源于stack exchange,提问作者Sebastien Diot
相关产品推荐
相关产品推荐

