如何在Lua中要求已加载的模块

时间:2014-01-21 18:24:51

标签: module lua

我有一个Lua模块,它返回一个导出表(即不使用不推荐的模块指令)。另外,我有一个脚本想要通过“require”函数加载该模块。 现在我将这两个文件从C代码加载到lua状态,如下所示:

luaL_loadstring(lua, someScript);
lua_pcall(lua, 0, LUA_MULTRET, 0);
luaL_loadstring(lua, someModule);
lua_pcall(lua, 0, LUA_MULTRET, 0);

require调用失败,因为它查找已加载的文件而不是代码。在这种情况下,是否有可能以某种方式从someScript中获取someModule?

3 个答案:

答案 0 :(得分:1)

documentation for require包含了使其工作所需的所有信息。具体来说,它告诉您require函数用于查找所请求代码的方法。更具体地说,关于package.loaded的第一句话是您可能想要关注的内容。

以上链接的文档:

  

加载给定的模块。该函数首先查看package.loaded表以确定是否已加载modname。如果是,则require返回存储在package.loaded [modname]中的值。否则,它会尝试为模块找到一个加载器。

     

要查找加载程序,require由package.loaders数组指导。通过更改此数组,我们可以更改查找模块的方式。以下说明基于package.loaders的默认配置。

     

首先要求查询package.preload [modname]。如果它有一个值,那么这个值(应该是一个函数)就是加载器。否则,需要使用package.path中存储的路径搜索Lua加载程序。如果失败,它将使用package.cpath中存储的路径搜索C加载程序。如果这也失败了,它会尝试一个多功能的加载器(参见package.loaders)。

     

找到加载器后,需要使用单个参数modname调用加载器。如果加载器返回任何值,则需要将返回的值赋给package.loaded [modname]。如果加载器没有返回任何值并且没有为package.loaded [modname]指定任何值,则require会为此条目指定true。在任何情况下,require都会返回package.loaded [modname]的最终值。

     

如果加载或运行模块时出现任何错误,或者无法找到模块的任何加载程序,则需要发出错误信号。

答案 1 :(得分:0)

为清楚起见,我们先命名:模块A返回一个导出表;脚本B是一个需要模块A的字符串,我假设B不返回任何内容。您还想要执行以下操作:

load script B (via luaL_loadstring): puts chunk on stack
run chunk for script B (via lua_pcall): puts whatever B returns on stack
load module A (via luaL_loadstring): puts chunk on stack
run module A (via lua_pcall): puts whatever A returns on stack

首先,模块A是一个文件,所以你可能已经将A的内容加载到一个字符串中。

你说你的问题是在脚本B中调用的require失败了。可能有几个原因,例如B确实需要'moduleA',但在LUA_PATH文件夹中找不到moduleA.lua。

所以:

  • 打印需要A的B部分,以便我们看到代码
  • 验证LUA_PATH是否可以找到moduleA.lua

确认上述内容之后,我们可以查看您的C API调用,但我怀疑这些是问题。

答案 2 :(得分:0)

如果someModule使用require"modname",请尝试以下代码:

lua_getglobal(lua, "package");
lua_getfield(lua, -1, "loaded");
luaL_loadstring(lua, someScript);
lua_pcall(lua, 0, 1, 0);
lua_setfield(lua, -2, modname);
luaL_loadstring(lua, someModule);
lua_pcall(lua, 0, LUA_MULTRET, 0);