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

为何Lua的-l选项无法找到当前目录下的lib1.lua模块?

Lua的-l选项无法找到当前目录下的lib1.lua文件?

将《Lua编程》中的首个示例函数保存为lib1.lua文件后,使用dofile加载可正常运行:

% lua
> dofile("lib1.lua")
> twice(3)
6.0

但使用-l选项加载时却提示找不到文件:

% lua -i -llib1.lua -e "print(twice(3))"
Lua 5.4.6  Copyright (C) 1994-2023 Lua.org, PUC-Rio
lua: module 'lib1.lua' not found:
    no field package.preload['lib1.lua']
    no file '/usr/share/lua/5.4/lib1/lua.lua'
    no file '/usr/share/lua/5.4/lib1/lua/init.lua'
    no file '/usr/lib64/lua/5.4/lib1/lua.lua'
    no file '/usr/lib64/lua/5.4/lib1/lua/init.lua'
    no file './lib1/lua.lua'
    no file './lib1/lua/init.lua'
    no file '/usr/lib64/lua/5.4/lib1/lua.so'
    no file '/usr/lib64/lua/5.4/loadall.so'
    no file './lib1/lua.so'
    no file '/usr/lib64/lua/5.4/lib1.so'
    no file '/usr/lib64/lua/5.4/loadall.so'
    no file './lib1.so'
stack traceback:
    [C]: in function 'require'
    [C]: in ?

经确认lib1.lua确实在当前执行目录下:

% ls
lib1.lua

原因及解决方法

问题核心在于-l选项的工作逻辑:

  • -l选项本质是调用Lua的require函数加载模块,而require接收的是模块名,不是完整文件名。模块名不需要加.lua后缀,Lua会自动根据package.path的路径模板匹配对应文件。
  • 你输入-llib1.lua,相当于让Lua加载名为lib1.lua的模块,它会按照模块名的层级去搜索(比如报错里的lib1/lua.lua),自然找不到你实际存在的lib1.lua。

解决方法:去掉.lua后缀,使用以下命令即可正常加载:

lua -i -llib1 -e "print(twice(3))"

额外说明:

  • dofile是直接按传入的文件名加载文件,因此dofile("lib1.lua")能正常找到目标文件;
  • require是模块加载机制,会先检查模块是否已加载,再按模块名搜索路径、自动处理后缀和目录结构,这是两者的核心差异。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:56:16