Lua解释器无法找到json模块问题求助
问题描述
我通过luarocks install --local json-lua安装了json-lua模块,执行eval $(luarocks path)配置路径后,在Lua 5.3.6解释器中执行require("json")时仍提示找不到该模块。操作流程如下:
(base) user@USR-0318:~/.luarocks/lib $ luarocks list Rocks installed for Lua 5.1 --------------------------- busted 2.2.0-1 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 2.2.0-1 (installed) - /usr/local/lib/luarocks/rocks-5.1 dkjson 2.8-1 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 2.8-1 (installed) - /usr/local/lib/luarocks/rocks-5.1 json-lua 0.1-4 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 lua-term 0.8-1 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 0.8-1 (installed) - /usr/local/lib/luarocks/rocks-5.1 lua_cliargs 3.0-2 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 3.0-2 (installed) - /usr/local/lib/luarocks/rocks-5.1 luafilesystem 1.8.0-1 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 1.8.0-1 (installed) - /usr/local/lib/luarocks/rocks-5.1 luassert 1.9.0-1 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 1.9.0-1 (installed) - /usr/local/lib/luarocks/rocks-5.1 luasystem 0.5.1-1 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 0.5.1-1 (installed) - /usr/local/lib/luarocks/rocks-5.1 mediator_lua 1.1.2-0 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 1.1.2-0 (installed) - /usr/local/lib/luarocks/rocks-5.1 penlight 1.14.0-2 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 1.14.0-2 (installed) - /usr/local/lib/luarocks/rocks-5.1 say 1.4.1-3 (installed) - /home/user/.luarocks/lib/luarocks/rocks-5.1 1.4.1-3 (installed) - /usr/local/lib/luarocks/rocks-5.1 (base) user@USR-0318:~/.luarocks/lib $ eval $(luarocks path) (base) user@USR-0318:~/.luarocks/lib $ echo $LUA_PATH /usr/local/share/lua/5.1/?.lua;./?.lua;/usr/local/share/lua/5.1/?/init.lua;/usr/local/lib/lua/5.1/?.lua;/usr/local/lib/lua/5.1/?/init.lua;/usr/share/lua/5.1/?.lua;/usr/share/lua/5.1/?/init.lua;/home/user/.luarocks/share/lua/5.1/?.lua;/home/user/.luarocks/share/lua/5.1/?/init.lua (base) user@USR-0318:~/.luarocks/lib $ lua Lua 5.3.6 Copyright (C) 1994-2020 Lua.org, PUC-Rio > require("json") stdin:1: module 'json' not found: no field package.preload['json'] no file '/usr/local/share/lua/5.1/json.lua' no file './json.lua' no file '/usr/local/share/lua/5.1/json/init.lua' no file '/usr/local/lib/lua/5.1/json.lua' no file '/usr/local/lib/lua/5.1/json/init.lua' no file '/usr/share/lua/5.1/json.lua' no file '/usr/share/lua/5.1/json/init.lua' no file '/home/user/.luarocks/share/lua/5.1/json.lua' no file '/home/user/.luarocks/share/lua/5.1/json/init.lua' no file './json.so' no file '/usr/local/lib/lua/5.1/json.so' no file '/usr/lib/x86_64-linux-gnu/lua/5.1/json.so' no file '/usr/lib/lua/5.1/json.so' no file '/usr/local/lib/lua/5.1/loadall.so' no file '/home/user/.luarocks/lib/lua/5.1/json.so' stack traceback: [C]: in function 'require' stdin:1: in main chunk [C]: in ? >
我发现json库安装在.luarocks/lib目录下,但执行luarocks path后该目录并未加入LUA_PATH,想知道自己哪里操作有误,该如何解决?
解决方案
核心问题:Lua版本不匹配
从luarocks list输出能看到,所有模块都是安装给Lua 5.1的,但你实际运行的是Lua 5.3.6。Luarocks默认绑定系统中的Lua 5.1,导致安装的模块无法被Lua 5.3识别。
解决步骤
1. 安装对应Lua 5.3的Luarocks
如果系统没有针对Lua 5.3的Luarocks,可通过以下方式安装:
- 源码编译(以Luarocks 3.9.2为例):
wget https://luarocks.org/releases/luarocks-3.9.2.tar.gz tar zxf luarocks-3.9.2.tar.gz cd luarocks-3.9.2 ./configure --lua-version=5.3 --with-lua-include=/usr/include/lua5.3 --with-lua-lib=/usr/lib/x86_64-linux-gnu make && sudo make install - 包管理器安装(Debian/Ubuntu):
sudo apt install luarocks5.3
2. 用Lua 5.3的Luarocks安装json-lua
使用对应版本的Luarocks命令(编译安装可能仍为luarocks,包管理器安装则为luarocks5.3):
luarocks5.3 install --local json-lua
3. 配置Lua 5.3的模块路径
执行对应版本的Luarocks路径命令配置环境变量:
eval $(luarocks5.3 path --local)
之后运行lua5.3,执行require("json")即可正常加载模块。
临时 workaround(不推荐长期使用)
若不想重新安装Luarocks,可手动将Lua 5.1的模块路径添加到Lua 5.3的package.path中:
-- 在Lua 5.3解释器中执行 package.path = package.path .. ";/home/user/.luarocks/share/lua/5.1/?.lua;/home/user/.luarocks/share/lua/5.1/?/init.lua" require("json")
但这种方式可能因Lua版本差异引发模块兼容性问题,优先推荐使用对应版本的Luarocks安装模块。
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

