如何在Lua中检查模块是否存在?
2013-3-15 9:54:4
收藏:0
阅读:245
评论:3
我正在使用 xdg-menu-to-awesome-wm 生成一个 Lua 文件,该文件包含 GNOME 菜单,用于 包含在 Awesome WM 中。由于生成器脚本可能没有安装,因此我需要一种方式,让 Lua 仅在“menu”模块_存在时_“require”该模块。
我不想通过文件名来查找该模块,因为它可能位于package.path中的任何位置。一个选择是在模块不存在时忽略创建的异常,但我不想忽略任何 其他 异常 - 我 确实 想知道该模块是否包含任何语法或其他错误。不幸的是,参考没有指定可以生成哪些异常,因此我不确定如何做到这一点。
点赞
用户12048
如果你需要区分一个缺失的模块和语法错误,你可以直接访问 package.searchers 中的搜索函数。
这些函数将会:
- 如果成功,返回一个加载器函数
- 如果未找到模块,返回一个字符串
- 如果存在语法错误,抛出一个错误
所以你可以模仿 require 模块查找的方式,按顺序调用每个搜索函数,直到其中一个返回一个函数为止。不像 require,如果每个搜索函数返回一个字符串时,我们不需要抛出一个错误来表示未找到该模块。
function isModuleAvailable(name)
if package.loaded[name] then
return true
else
for _, searcher in ipairs(package.searchers or package.loaders) do
local loader = searcher(name)
if type(loader) == 'function' then
package.preload[name] = loader
return true
end
end
return false
end
end
2013-03-15 14:19:23
用户289483
看,我在 'luafilesystem' 模块上遇到了同样的问题,我像这样解决了它:
local haslfs,lfs = pcall(require,"lfs")
if haslfs then
configLines["PROJECT_HOME"] = lfs.currentdir()
else
configLines["PROJECT_HOME"] = prompt("Project path > ")
end
这里的 'lfs' 是模块句柄。使用 pcall 来了解模块是否真正加载,而不会传播错误。
2014-03-27 11:22:18
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我所做的是将 require 包装在 pcall 中,以便加载模块并捕获加载失败。以下是我使用的完整函数,用于从我们的服务器下载和安装缺少的模块: http://www.fhug.org.uk/wiki/doku.php?id=plugins:code_snippets:module_require_with_load
function loadrequire(module) local function requiref(module) require(module) end res = pcall(requiref,module) if not(res) then -- 当没有模块时执行的操作 end end loadrequire('menu')