lua - 是否可以根据 Lua 脚本的位置而不是当前目录进行导入?

标签 lua

如果我有两个脚本在同一目录中相互引用

A/
   foo.lua
   bar.lua

foo.lua

require "bar"

bar.lua

print "It worked"

然后从同一文件夹运行 lua 可执行文件就可以了

cd A; lua foo.lua

但从另一个文件夹运行解释器失败,并显示“未找到模块‘bar’”消息

cd A/..; lua A/foo.lua

有没有办法让我的相对导入不依赖于当前工作目录?例如,在批处理文件中,我可以将路径设置为相对于 dirname $0

最佳答案

主要问题是 package.path 不考虑运行脚本所在的目录。虽然 Doug 的解决方案有效,但如果您必须不断添加,这可能会变得乏味

package.path = 'foobar_path/?.lua;'..package.path

到您计划从不同工作目录运行的脚本。为了使它变得更容易,您可以创建一个模块,在需要时自动将运行脚本的目录添加到 package.path 中。该模块将驻留在 package.path 中列出的默认位置之一,以便可以找到它。

-- moduleroot.lua
local moduleroot = arg and arg[0]
if moduleroot then
  local path = moduleroot:match [[^(.+[\/])[^\/]+$]]
  if path and #path > 0 then
    package.path = path..'?.lua;'..package.path
    package.cpath = path..'?.dll;'..package.cpath
    return path
  end
end

-- foo.lua
require "moduleroot"
require "bar"

事实上,这是一个很常见的问题, Penlight 包括一个处理此问题的便利设施: pl.app.require_here

关于lua - 是否可以根据 Lua 脚本的位置而不是当前目录进行导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11714204/

相关文章:

c++ - 从Lua创建C++类或 “entity”(或类似的东西)

c++ - 如何在我的代码中查找(并删除)需要管理员权限的位置?

c - 从 Lua 调用 C 时出错

lua - Torch:如何按行对张量进行洗牌?

c++ - cocos2d-x使用lua,如何继承一个c++类并覆盖其函数

opengl - 无法让预制作工作 - 过度演示

lua - 是否可以在 Lua Redis 中使用 SHA1?

python - 如何从 Lua 调用 Python 函数?

Lua 表从 API 到主程序不可见

c++ - 从 const char 创建一个 Lua 表 **