You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lua中相对路径为何相对执行目录?如何改为相对脚本所在目录?

问题原因

Lua标准库中的dofile、loadfile等文件加载函数,底层直接调用操作系统的文件访问接口,操作系统解析相对路径时,默认的基准路径是进程的当前工作目录(CWD),也就是你执行lua命令时所处的目录,和脚本文件本身的存放路径没有关系,所以才会出现不同执行目录下运行同一条命令结果不一致的情况。

实现基于脚本自身路径的相对路径加载

可以通过获取当前执行脚本的存放路径,拼接目标相对路径得到绝对路径后再加载,就可以实现类似CommonJS的require效果,具体实现如下:

封装自定义相对路径加载函数

local function require_relative(relative_path)
    -- 获取调用当前函数的脚本的文件信息
    local info = debug.getinfo(2, "S")
    -- 去掉调试信息中脚本路径开头的@符号
    local script_path = info.source:sub(2)
    -- 提取当前脚本的所在目录,兼容Windows和Unix路径格式
    local current_dir = script_path:match("(.*[/\\])") or "./"
    -- 拼接得到目标文件的绝对路径
    local absolute_path = current_dir .. relative_path

    -- 实现和原生require一致的缓存逻辑,避免重复加载
    if not package.loaded[absolute_path] then
        local load_func, err = loadfile(absolute_path)
        if not load_func then
            error("加载文件失败:" .. absolute_path .. ",错误信息:" .. err)
        end
        local module = load_func()
        package.loaded[absolute_path] = module or true
    end
    return package.loaded[absolute_path]
end

改造后的b.lua代码

-- 上面的require_relative函数可以放在公共工具模块引入,也可以直接写在当前脚本顶部
require_relative("../a.lua")
print(foo)

改造完成后,不管你在哪个目录执行lua subdirectory/b.lua,路径解析始终以b.lua自身的存放目录为基准,都能正常找到a.lua文件。

内容的提问来源于stack exchange,提问作者Nirvana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:27:06