无法在 Lua 中使用 require
我的理解是,如果你要求的文件在你要求的目录中或者在 package.path
的路径中,你就可以要求它。
但对我来说,即使文件在同一目录中,我仍然会收到 模块未找到!
的错误。
至于 package.path
,列出的目录在我的电脑上不存在。这是我的 package.path
:
/usr/local/share/lua/5.2/?.lua;/usr/local/share/lua/5.2/?/init.lua;/usr/local/lib/lua/5.2/?.lua;/usr/local/lib/lua/5.2/?/init.lua;/usr/share/lua/5.2/?.lua;/usr/share/lua/5.2/?/init.lua;./?.lua
除了我为不同目的创建的目录之外,我的电脑上没有名为“lua”的文件夹(我找不到)。这使我怀疑安装有问题,尽管我尝试卸载 Lua 并得到虚拟包'lua'无法删除
。这可能与问题有关,但除了无法要求模块和没有命名为“lua”的目录之外,一切正常。
此时,我不知道该怎么办。除了“将其追加到package.path
中!”之外,我找不到有关此主题的太多信息,但我宁愿能够简单地将这两个文件放在同一个目录中使其工作。
我该如何修复此问题?
我还有一个小问题:Lua 是否有默认模块/包?
编辑:
操作系统 - Ubuntu Linux
Lua 版本 - 5.2
我运行 foo = require('bar')
我没有尝试要求二进制模块,我正在尝试要求我编写的 lua 文件。
当我开始使用 require()
导入文件时,你的理解就和我一样的差。
现在我明白了(针对 Linux 的 Lua)...
require()
会首先在package.loaded
中查找- 如果在
package.loaded
中未找到,它将在package.preload
中查找加载器函数。 - 如果第 1 步和第 2 步都失败了,则它将尝试在搜索路径中查找
*.lua
(Lua 代码)、*.bin
(Lua 二进制代码)和*.so
(库)
我对 require()
的建议是编写一个返回所需内容的 package.preload
函数,以此来填充 package.loaded
。
因为你可以在其中使用完整或相对路径进行 loadfile()
或 dofile()
。
这样就不需要修改 package.path
。
因此,也可以启动主脚本而不必更改当前目录到主脚本位置。
package.preload
函数的示例如下:
-- require('test') 的加载器
package.preload.test=function() return {test='test'} end
-- 现在进行导入...
newtable=require('test')
-- 使用它...
print(newtable.test) -- 输出:test
带有 loadfile()
的 package.preload
函数示例:
-- 为 require('rot') 添加一个加载器
package.preload.rot=loadfile('/home/knoppix/lua/rot.lua')
如果你查看 package.loaded
,则第二个问题可以自己回答。
如我所写的,require()
首先在其中搜索。
尝试一下...
_G=empty -- 删除 _G
-- 现在只需简单地重新安装它...
_G=require('_G')
-- 它将从 `package.loaded` 中恢复
你可以尝试将文件读取为字符串,然后编译和执行该字符串。例如:
--而不是写“require 'mymodule'”你可以这样说:
--读取文件内容
local f=io.open("mymodule.lua","r")
local s = f:read("*a")
--loadstring编译一段代码并返回一个函数。在某些Lua版本中,loadstring未定义,因此您可以使用load(同样的事情,不同的名称)
loadstring = loadstring or load
loadstring(s)()
--关闭文件对象
f:close()
您可以将其转换为函数:
loadstring = loadstring or load
function myrequire(modulename)
f = io.open(modulename,"r")
loadstring(f:read("*a"))()
f:close()
end
实际上,存在一个类似的东西,称为“dofile”。它具有与“myrequire”完全相同的效果。
注意:
这些东西可能会完成您的工作,但您应该知道,require不完全与dofile相同。不同之处在于require不仅查找当前目录,还在“package.path”变量指定的目录中查找。此外,require将所有已加载的模块存储在“package.loaded”中,因此当您尝试多次加载同一个模块时,速度更快。
使用 dofile("path/to/file.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中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你没有提供足够的信息来帮助你,因为你没有指定你正在使用的 Lua 版本(我猜测是 5.2,根据文件路径),操作系统(Linux?),你实际执行的
require
命令或者你要求的 lua 文件相对于要求它的文件的位置,等等。你的假设是正确的,但可能有多个问题会阻止你加载文件。例如,它可能在正确的位置,但是你使用的是
require "foo.lua"
而不是require "foo"
,这是不会起作用的。或者你正在尝试加载一个二进制模块(它不会受到package.path
配置的影响)。或者有一个你正在加载的模块的依赖关系未得到满足。有的,像
debug
、math
、io
等等,但你看不到它们作为 Lua 文件,因为它们跟 Lua 解释器的其他部分一样编译为 C 模块。