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

时间:2013-03-15 09:54:04

标签: lua

我正在使用包含GNOME菜单的xdg-menu-to-awesome-wmgenerate a Lua file,在Awesome WM中使用inclusion。由于可能未安装生成器脚本,因此我需要一些方法让Lua只require menu模块(如果存在)

我不想查看文件名,因为它可能位于package.path的任何位置。一种选择是忽略模块不存在时创建的异常,但我宁愿不忽略任何其他异常 - 我想知道模块是否包含任何语法或其他错误。遗憾的是,reference没有指定可以生成哪些例外,所以我不知道该怎么做。

3 个答案:

答案 0 :(得分:13)

如果您需要区分缺少的模块和语法错误,可以直接访问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

答案 1 :(得分:5)

我所做的是将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
        -- Do Stuff when no module
    end
end
loadrequire('menu')

答案 2 :(得分:4)

看,我和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用于知道模块是否真正加载而不传播错误。