gpt4 book ai didi

Lua:来自不同工作目录的相对导入失败

转载 作者:行者123 更新时间:2023-12-03 18:15:18 25 4
gpt4 key购买 nike

我正在尝试将一些由主模块和一些辅助模块组成的 Lua 库重新打包到 Docker 容器中。帮助模块保存在库的子文件夹中,以便从主文件导入

require 'helpers/SomeHelper'

问题是:由于我希望 Docker 容器工作的方式,如果我可以从不同的工作文件夹调用这个库,那将非常有帮助。也就是说,我对主程序的调用类似于
th /app/main.lua

无论我站在哪个实际工作目录中。不幸的是,当工作目录与主文件所在的目录不同时,相对导入似乎会失败。

有什么方法可以配置 LUA_PATH 或任何其他机制来使这些导入正常工作?请注意,更改库本身的代码将是一个糟糕的解决方案,因为它不是由我开发的,我希望能够轻松地将其更新到较新的版本。

最佳答案

如果你不关心工作目录,你可以加载 lfs / LuaFileSytem并使用 lfs.chdir ( src_dir )切换到源目录(可能先用 lfs.currentdir ( ) 保存当前工作目录。)

您还可以扩展 search path Lua 以便它搜索那些额外的目录。搜索由 package.searchpath 驱动.添加目录/foo/bar/以支持所有通常支持的库布局的方式进行搜索,添加

  • /foo/bar/?.lua;/foo/bar/?/init.luapackage.path
  • /foo/bar/?.so (或 .dylib.dll 在其他 OSen 上)到 package.cpath

  • 您可以使用多种方法来扩展路径。

    一个行之有效的选项是设置 LUA_PATH/ LUA_CPATH环境变量。 (其中一个中的 ;; 序列将扩展为完整的默认路径。)这可以从 .profile 完成。或通过较早的 export LUA_PATH="..." 的其他设置脚本或(如果从包装脚本开始)通过仅为该调用设置变量进行内联 LUA_PATH="..." lua /foo/bar.lua . (请注意,如果您在过于宽泛的范围内导出此变量,其他 Lua 脚本也会扩展其路径,并且可能会发现可能不兼容的 Lua 库。)

    (您也可以从 package.(c)path 手动修改 LUA_INIT 。这样,您将无法独立禁用 LUA_INITLUA_PATH ,但您可以使用所有 Lua 动态生成路径。)

    第三种选择(这在您的特定情况下可能是最好的)是将 package.path 的扩展名在主脚本的顶部,如
    do
    local dir = (arg[0]:match "^(.*)/$")
    if dir then -- else cwd is . which works by default
    package.path = dir.."/?.lua;"..dir.."/?/init.lua;"..package.path
    package.cpath = dir.."/?.so;"..package.cpath
    end
    end

    -- rest of your program goes here

    使用 Lua 解释器运行脚本时, arg[0]是脚本。所以这扩展了路径以包含程序的目录,无论它位于何处,它只会影响这个特定脚本/程序的搜索路径。

    关于Lua:来自不同工作目录的相对导入失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46024370/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com