【问题标题】:in lua (love2D), i want to import a library in a subfolder, the file in there will not find the next module it requires在lua(love2D)中,我想在子文件夹中导入一个库,那里的文件找不到它需要的下一个模块
【发布时间】:2018-01-16 08:56:11
【问题描述】:

所以在 lua 中,我想导入一个模块。

我想将我的“多边形”库放在一个子文件夹中,所以我像这样引用它

局部多边形 = require('polygon.polygon')

但是,它需要另一个名为“delaunay”的模块,它在检查主文件夹时找不到它

是否还缺少编辑我的库以使其正常工作? (某种添加搜索路径的能力?)

谢谢

【问题讨论】:

  • 提供错误信息和更多关于您的文件夹结构的信息
  • Lua 在支持模块的相对路径方面存在问题。
  • 如果 delaunay 在多边形子文件夹中,您可以使用 require('polygon.delauny')。更好的解决方案可能是确保两个文件都可以通过 package.path 找到(如其他答案中所述),并且只使用 require('polygon') 和 require('delaunay')。这样,如果你要改变你的目录结构,你只需要改变 package.path。

标签: lua love2d


【解决方案1】:

要知道在哪里寻找模块,Lua 的 require 使用变量 package.path (.lua) 和 package.cpath (.so/.dll)。您可以在程序中更改它们以查看您所在的目录。为了保持一致性,您可以查看它们的内容以了解要使用哪个操作系统特定的分隔符。例如:

local sep = package.path:find("\\") and "\\" or "/"
package.path = package.path .. ";." .. sep .. "polygon" .. sep .. "?.lua"

这会将./polygon/?.lua 包含在搜索路径中,因此,对require "delaunay" 的调用将使require 函数在现有路径之外查找./polygon/delaunay.lua。请记住,在require 字符串中,. 表示就文件搜索而言的分隔符,因此在这种情况下调用require "polygon.delaunay" 将意味着搜索./polygon/polygon/delaunay.lua

根据我对您的问题的理解,更改 package.path 变量以包含存储您的 delaunay 库的路径将解决您的问题,尽管要提供特定解决方案有关您的项目和目录结构的更多信息是必填。

【讨论】:

  • 你可以在windows和unix系统的path/cpath中使用“/”作为分隔符
  • 这是个坏主意。 package.path 是全局的。每个请求,此代码都会执行并无限连接。最后,它会爆炸。我对这段代码的 PROD 体验很差。请改用 lua_package_path。另请阅读这篇文章medium.com/@fabricebaumann/…
【解决方案2】:

所有加载到package.loaded 的内容都可以用require() 加载,因为require()package.loaded 中首先出现...

-- Lua 5.3 ( lua -i )
> package.loaded.code=load(code.dump)()
> test=require('code')
> test
function: 0x565cb820

所以您可以使用load()loadfile('/path/to/your_code.lua') 来执行此操作。此方法的另一个不错的功能是加载转储代码...

> package.loaded.shell=loadfile('shell.bin')
> shell=require('shell')
> shell('cat shell.bin')
uaS�
�
xV(w@F@�d�@��F�@G���d@��F�@G���d@&�typestringoexecute
/bin/bash>

【讨论】:

    【解决方案3】:

    无论如何,您似乎必须明确地处理子文件夹。

    如,模块polygon 必须将delaunay 导入为polygon.delaunay

    或者必须将模块名称附加到 package.path 以便 lua 可以在子文件夹中搜索文件名:

    package.path=package.path..";./polygon/?.lua"
    

    更多信息是here

    在 cmets 中指出,您可能希望确保路径连接只发生一次。 此外,还应警惕名称阴影。

    最后,当我们在回顾过去时,在问题提出五年前here 提出了一个解决问题的绝妙技巧。

    【讨论】:

    • 这是个坏主意。 package.path 是全局的。每个请求,此代码都会执行并无限连接。最后,它会爆炸。我对这段代码的 PROD 体验很差。请改用 lua_package_path。也阅读这篇文章medium.com/@fabricebaumann/…
    • @uwevil 我不确定 Web 服务是如何工作的,但在 LÖVE2D 中,您可以将此代码放入在程序初始化时仅运行一次的 love.load() 函数中。从谷歌看来,lua_package_path 是 nginx 特有的功能。
    猜你喜欢
    • 2012-06-07
    • 2011-07-25
    • 2021-10-29
    • 1970-01-01
    • 2022-12-10
    • 2023-03-30
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多