如何检查Lua中是否存在模块?

如何检查Lua中是否存在模块?,lua,Lua,我习惯于包含GNOME菜单,例如在Awesome WM中。由于可能未安装生成器脚本,因此我需要某种方法使Lua仅需要菜单模块(如果存在) 我不想浏览文件名,因为它可能位于package.path中的任何位置。一个选项是忽略当模块不存在时创建的异常,但我不想忽略任何其他异常-我想知道模块是否包含任何语法或其他错误。不幸的是,没有指定可以生成哪些异常,因此我不确定如何执行。我所做的是将require包装在pcall中,以便加载模块并捕获加载失败。这里有一个完整的功能,我使用它从我们的服务器下载并安装

我习惯于包含GNOME菜单,例如在Awesome WM中。由于可能未安装生成器脚本,因此我需要某种方法使Lua仅需要
菜单
模块(如果存在)


我不想浏览文件名,因为它可能位于
package.path
中的任何位置。一个选项是忽略当模块不存在时创建的异常,但我不想忽略任何其他异常-我想知道模块是否包含任何语法或其他错误。不幸的是,没有指定可以生成哪些异常,因此我不确定如何执行。

我所做的是将require包装在pcall中,以便加载模块并捕获加载失败。这里有一个完整的功能,我使用它从我们的服务器下载并安装缺失的模块:


如果需要区分缺少的模块和语法错误,可以直接访问
package.searchers
中的searcher函数

这些职能将:

  • 如果成功,则返回加载器函数
  • 如果找不到模块,则返回字符串
  • 如果存在语法错误,则引发错误
因此,您可以模仿
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

听着,我对“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用于知道模块是否真的加载了,而没有传播错误。

看起来不错;我很快就会试试的。妮特:是因为我,还是缩进不一致?当你可以只做
res=pcall(require,module)
时,为什么要创建一个本地内部函数?10b0-主要是因为我键入了一些并粘贴了其余的函数。迈克:老实说,我不记得了,我想我在一些插件中从几个地方调用了它。这不会传播语法错误-只是一个布尔结果,没有显示出哪里出了问题-所以它实际上不是我需要的。@DreamEater这不是我要问的。这只是一个非常常见的可读性因素。如果isModuleAvailable(“menu”)则使用
测试结果,然后要求(“menu”)结束
:如果
菜单
包含语法错误则崩溃,如果缺少或正确则成功。非常感谢。今天刚刚有了这个问题,答案部分的许多人似乎没有意识到没有找到的模块与现有的模块不一样,但有语法错误,或者(更糟糕的是)需要自己的模块,而这些模块本身并不存在或有语法错误。芬恩的回答正是我所需要的
local haslfs,lfs = pcall(require,"lfs")
if haslfs then
  configLines["PROJECT_HOME"] = lfs.currentdir()
else
  configLines["PROJECT_HOME"] = prompt("Project path > ")
end