如果我有两个脚本在同一目录中相互引用
A/
foo.lua
bar.lua
foo.lua
require "bar"
bar.lua
print "It worked"
然后从同一文件夹运行lua可执行文件
cd A; lua foo.lua
但是从另一个文件夹运行解释程序失败,并显示“找不到模块'栏”消息
cd A/..; lua A/foo.lua
有没有办法让我的相对导入不依赖于当前的工作目录?例如,在批处理文件中,我可以将路径设置为相对于dirname $0
。
答案 0 :(得分:2)
通常的做法是更新package.path
以包含A
的父级(或将A
放在路径上)。然后使用require
并将模块称为A.bar
和A.foo
可以使用debug.getinfo
找到目录,但在应用程序中使用debug
模块并不是一个好主意,在这种情况下不是必需的。
请参阅this相关SO问题 - 使用package.path
。
答案 1 :(得分: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
。