Require寻找.dll文件而非我的模块?

所以我一直在尝试弄清楚这个问题,我正在做以下事情

main.lua:

package.path = io.popen("cd"):read'*all' -- 设置路径与main.lua相同(用于导出)
local u  = require("utilities") -- 这是出问题的那行

utilities.lua:

local u = {}

function u.GetService(s)
    return require(tostring(s))
end

function u.Wait(s)
    local ntime = os.clock() + s/10
    repeat until os.clock() > ntime
end

function u.NPWait(s)
    local ntime = os.time() + s
    repeat until os.time() > ntime
end

return u

错误信息:

找不到名为'utilities'的模块:

  • 这里会有一个搜索,确实会在正确的文件夹中查找,但会寻找'.dll'文件

require从来不是我擅长的事情,有时候它能正常工作,有时候像这样出问题,如果有人能帮我理解如何解决这个问题,谢谢你,因为这个问题一直在有时候困扰着我

点赞
用户2858170
用户2858170

require("utilities.lua") 应该可以工作。

你必须指定如何从所需的名称获取到文件。例如,通过添加路径和文件扩展名。

如果你想要通过 require("script") 来引用 c:\folder\script.lua,你的 package.path 必须包含类似于 c:\folder\?.lua 的内容,其中 ? 被所需的名称替换。

如果你的模块在一个带有其名称和一个名为 init.lua 的模块的文件夹中,则路径为 c:\folder\?\init.lua

在覆盖 package.path 之前,只需打印原始 package.path 并查看其中的内容即可。

请参阅 Lua参考手册 6.3 模块:package.searchpath

路径是一个字符串,其中包含由分号分隔的模板序列。对于每个模板,该函数使用名称中所有出现的分隔符(默认为句点)替换模板中的每个问号(如果有的话),并尝试打开生成的文件名。

例如,如果路径是字符串

"./?.lua;./?.lc;/usr/local/?/init.lua",则对名称 foo.a 的搜索将尝试按顺序打开文件 ./foo/a.lua、./foo/a.lc 和 /usr/local/foo/a/init.lua。

2020-04-16 06:27:47
用户4984564
用户4984564

你误解了 package.path

与 Windows 和 Linux 使用的 PATH 变量不同,Lua 不仅需要告诉它应该查找哪个目录,还需要告诉它文件的样子。

你正在完全删除默认搜索路径,用无法找到任何文件的错误路径进行替换。

通常情况下,要将新目录添加到路径中,应同时添加 C:\path\to\your\files\?.luaC:\path\to\your\files\?\init.lua 两个路径,这是Lua默认加载模块的两种方式。

你也不应该替换 package.path,因为这会防止模块在其他地方被加载。

你的代码应该类似于这样:

local cd = io.popen("cd")
package.path = cd:read('*line') .. "\\?.lua;" .. package.path
cd:close()

之所以它仍在寻找 DLL 文件,是因为 package.cpath 是单独的,所以你没有更改它。

2020-04-16 06:58:16