2

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

A/
   foo.lua
   bar.lua

foo.lua

require "bar"

酒吧.lua

print "It worked"

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

cd A; lua foo.lua

但是从另一个文件夹运行解释器失败并显示“找不到模块'bar'”消息

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

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

4

2 回答 2

2

执行此操作的常用方法是更新package.path以包含A(或放在A路径上)的父级。然后使用require和引用模块作为A.barA.foo

参见手册条目require

可以找到目录,debug.getinfodebug在应用程序中使用模块不是一个好主意,在这种情况下也没有必要。

请参阅这个相关的 SO 问题 - 使用package.path.

于 2012-07-30T01:01:23.783 回答
2

主要问题是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.

于 2013-08-04T11:58:47.683 回答