在lua(love2D)中,我想在子文件夹中导入一个库,其中的文件将找不到它需要的下一个模块
所以在lua中,我想导入一个模块 我想把我的“多边形”库放在一个子文件夹中,所以我像这样引用它 局部多边形=需要('polygon.polygon')) 但是,它需要另一个名为“delaunay”的模块,它无法找到它,因为它检查主文件夹 为了让它正常工作,我的库是否缺少编辑?(某种添加搜索路径的能力?)在lua(love2D)中,我想在子文件夹中导入一个库,其中的文件将找不到它需要的下一个模块,lua,love2d,Lua,Love2d,所以在lua中,我想导入一个模块 我想把我的“多边形”库放在一个子文件夹中,所以我像这样引用它 局部多边形=需要('polygon.polygon')) 但是,它需要另一个名为“delaunay”的模块,它无法找到它,因为它检查主文件夹 为了让它正常工作,我的库是否缺少编辑?(某种添加搜索路径的能力?) 无论如何,谢谢,看来您必须明确地处理子文件夹 与中一样,模块polygon必须将delaunay导入为polygon.delaunay 或模块名称必须附加到package.path,以便lua可
无论如何,谢谢,看来您必须明确地处理子文件夹 与中一样,模块
polygon
必须将delaunay
导入为polygon.delaunay
或模块名称必须附加到package.path,以便lua可以在子文件夹中搜索文件名:
package.path=package.path..";./polygon/?.lua"
更多信息是
注释中指出,您可能希望确保路径连接只发生一次。
此外,人们应该警惕名字的阴影
最后,当我们在回顾过去的时候,一个非常巧妙的解决方法在问题出现的五年前被提出了。要知道在哪里寻找模块,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函数look for/polygon/delaunay.lua
。请记住,在require
字符串中,
就文件搜索而言表示分隔符,因此在此场景中调用require“polygon.delaunay”
将意味着搜索/polygon/polygon/delaunay.lua
根据我对您问题的理解,更改
package.path
变量以包括存储delaunay
库的路径可以解决您的问题,尽管要提供特定的解决方案,需要提供有关项目和目录结构的更多信息。所有加载到包中的内容。加载的可以与require()
一起加载,因为require()
首先在包中查找。加载的
-- 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>
提供有关文件夹结构的错误消息和详细信息Lua在支持模块的相对路径方面存在问题。如果delaunay位于polygon子文件夹中,则可以使用require('polygon.delauny')。更好的解决方案可能是确保这两个文件都可以通过package.path(如其他答案中所述)找到,并且只使用require('polygon')和require('delaunay')。这样,如果要更改目录结构,只需更改package.path。您可以在windows和unix系统的path/cpath中使用“/”作为分隔符。这是个坏主意。package.path是全局的。每一个请求,这段代码都会无限地执行和连接。最后,它会爆炸。我在PROD中使用此代码的经验不好。请改用lua\u包路径。读这篇文章也是个坏主意。package.path是全局的。每一个请求,这段代码都会无限地执行和连接。最后,它会爆炸。我在PROD中使用此代码的经验不好。请改用lua\u包路径。也请阅读本文@uwevil我不确定web服务是如何工作的,但在LÖVE2D中,您可以将此代码放入love.load()
函数中,该函数在程序初始化时只运行一次。从谷歌看来,lua\u package\u path
是nginx特有的特性。