package.path没有被正确设置。
2014-1-3 20:48:42
收藏:0
阅读:160
评论:1
我遇到一个情况,取决于我在哪里定义package.path,我的代码会失败。我不明白为什么。
我有以下文件结构:
/usr/share/zaf/mytestapp/main.lua
/usr/share/zaf/mytestapp/lib/user.lua
/usr/share/zaf/mytestapp/lib/admin_user.lua
正常工作的代码
在main中,我有以下代码:
module (..., package.seeall)
package.path = package.path .. ';/usr/share/zaf/mytestapp/?.lua'
local user = require "lib.user"
list_devices = function(user_id, enduser, start_record, record_count)
local devices = {}
local success
local res, err = pcall(function()
if enduser then
success, devices = user:getDevices(user_id)
end
end) --end pcall
return devices
end
这段代码可以正常工作...系统能够找到user.lua并返回一个设备列表。
不工作的代码
我想更改代码,以便在我知道用户类型之后才加载库。请注意,我已将实例化用户对象的代码位置移至“if”语句内部,但我保留了package.path行的位置。
module (..., package.seeall)
package.path = package.path .. ';/usr/share/zaf/mytestapp/?.lua'
list_devices = function(user_id, enduser, start_record, record_count)
local devices = {}
local success
local res, err = pcall(function()
if enduser then
local user = require "lib.user"
success, devices = user:getDevices(user_id)
else
--admin
local admin_user = require 'lib.admin'
admin_user:get_devices()
end
end) --end pcall
return devices
end
这段代码失败了,因为它无法再找到lib.user模块...我不明白为什么。我还在学习Lua,所以如果这是一个真正的入门问题,请原谅我。如果我将package.path行移到if语句内部,它会起作用...就像这样:
if enduser then
package.path = package.path .. ';/usr/share/zaf/mytestapp/?.lua'
local user = require "lib.user"
success, devices = user:getDevices(user_id)
else
--admin
local admin_user = require 'lib.admin'
success, devices = admin_user:get_devices()
end
我不想多次定义package.path...
如果有建议,将不胜感激。
谢谢。
编辑1
我想我弄清楚了发生了什么...但我不知道为什么或如何修复它。如果我在文件顶部设置package.path定义,在代码进入list_devices()方法时,package.path将被重置回默认值。我通过添加一个调试语句来测试这一点,该调试语句在代码失败的if语句中转储了package.path的内容。它不再具有我附加的路径,即"/usr/share/zaf/mytestapp/?.lua"。
这就解释了为什么我不能实例化对象。由于似乎我没有明显错误(以前我不确定,因为我是Lua的新手),我将在另一棵树上吠。我正在使用一个框架。也许它有一个bug...正在测试它。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
你展示的代码没有问题。问题的根源在于未显示的代码与使用
pcall。pcall可以捕获错误并返回一个返回代码,使你的脚本即使在匿名函数中出现错误时仍然能够继续运行,但是这既有用又危险(如果没有适当的检查)。例如,我运行以下
main.lua:package.path = package.path .. ";testreqdir/?.lua" list_devices = function(end_user) function test() if end_user then print('requiring') local user = require "testlib.user" user:test() end end local status, errMsg = pcall(test) end list_devices(true)在文件夹
testreqdir/testlib中,user.lua是这样的:print('user loaded') return { test = function() print('hello', arg[0]) end }这将产生以下输出:
C:\Users\me>lua testrequire.lua requiring user loaded hello testrequire.lua如果我注释掉
package.path行,使user.lua模块无法找到,输出将如下所示,由于pcall,没有指示调用require时发生错误:最可能的是,当你从函数中要求
user.lua时,会发生错误,但被pcall捕获并作为代码返回。因此,暂时删除pcall,以便获得回溯。此外,如果您坚持使用pcall,您应该添加代码来检查 err 的返回代码并采取适当的措施。您可能会对xpcall感兴趣,它允许您设置错误处理程序函数;这可能会导致更清晰的代码。