【问题标题】:Lua: require fails to find submodule, but searchpath succeeds?Lua: require 找不到子模块,但是 searchpath 成功了?
【发布时间】:2013-08-10 03:37:40
【问题描述】:

通常当我有关于远程软件相关的问题时,我发现其他人已经问过同样的问题,并且得到了对我也有用的好答案。

不过,这一次,我没能找到解决我困境的办法。

我们开始: 我目前正在尝试将我的 Lua 编程提升一个或三个等级,并希望使用模块。所以,我有一个这样的结构:

main.lua
foo/bar.lua

现在,我在 main.lua 中做

require("foo.bar")

失败了,

main.lua:1 module 'foo.bar' not found:
     no field package.preload['foo.bar']
     no file 'foo.bar.lua'
     no file 'foo.bar.lua'
     no file 'foo.lua'

好的,我的package.path 可能有问题,所以我使用package.searchpath("foo.bar", package.path) 来查看我做错了什么。

问题在于package.searchpathfoo.bar 解析为foo/bar.lua,这是完全正确的。

据我了解,package.searchpath 尝试以与 require 相同的方式查找模块,但在我的情况下似乎存在一些故障。

让我感到奇怪的是错误输出中 no file 'foo.bar.lua' 的重复

我误解了 require 的用法吗?

我正在使用 LuaJIT-2.0.0 运行我的块


更新:

我正在使用 LuaJIT-2.0.0 运行我的块

【问题讨论】:

  • 你可以试试 lua.org 的现货 Lua 吗?
  • 您能否在您的设置中加入 package.path 的内容?
  • This 可能是相关的。
  • @lhf,我用 Lua-5.2.2 试了一下,效果很好……看来问题出在 LuaJIT 上。
  • @greatwolf ,我会尝试您的方法来解决 LuaJIT 的问题(不幸的是,目前无法更改此选项)

标签: lua require


【解决方案1】:
package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .."?.lua;".. package.path
require("foo.bar")

这一行导致require 与 当前文件被要求加载其他文件时。如果你想要它 搜索相对于当前目录的目录,插入 " 和 ?.lua 之间的相对路径

这是需求说明的一部分:

[...] 否则需要使用存储在 package.path。如果这也失败了,它会使用 存储在 package.cpath 中的路径。如果这也失败了,它会尝试 多合一加载器(参见package.loaders)。

package.path 的默认路径始终是执行指定脚本的 .exe。

【讨论】:

  • 我认为这可以解释我的问题,我将脚本称为../luajit main.lua。明天将验证这一点!
猜你喜欢
  • 2015-05-11
  • 2017-10-11
  • 2016-03-15
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
相关资源
最近更新 更多