加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

lua模块没有加载库

发布时间:2020-12-14 21:47:22 所属栏目:大数据 来源:网络整理
导读:背景资料: 我只是lua的新手,我正在努力了解模块是如何工作的.但我正在尝试将预先存在的模块加载到新脚本中,并从命令行运行此脚本. 码: 我有一个名为main.lua的文件,看起来像这样: module (...,package.seeall)-- Load librariesrequire("luasql.postgres"
背景资料:

我只是lua的新手,我正在努力了解模块是如何工作的.但我正在尝试将预先存在的模块加载到新脚本中,并从命令行运行此脚本.

码:

我有一个名为main.lua的文件,看起来像这样:

module (...,package.seeall)
-- Load libraries
require("luasql.postgres")
require("luasql.sqlite3")

local connect_to_db = function()
   if not global_con then
      env = assert (luasql.postgres())
      global_con = assert (env:connect(databasename,databaseUser,databasepassword,databaseserver))   
      return true
   else
      return false 
   end
end

update_widget = function (parm1,parm2,parm3)
  local connected = connect_to_db()         
  if connected then
     -- do something else
     return true
  end
end -- end function.

我现在正在尝试为此模块创建一个测试脚本.我在一个单独的lua文件中有以下逻辑:

package.path = '/usr/share/myapp/main.lua;'
local my_object = require("main")

print my_object.update_widget

问题:

我尝试运行测试脚本时收到以下错误:

attempt to call field 'postgres' (a table value)

它失败的行是在connect_to_db()方法中,我尝试创建一个环境变量:

env = assert (luasql.postgres())

到目前为止我尝试过的事情:

>我已经在我的测试脚本中修改了package.path,以匹配main.lua使用的内容.我这样做是通过执行main.lua的“常规”方式 – 由Web应用程序驱动 – 并将package.path的内容转储到日志文件中.
我已经从日志文件中复制了路径并将其用作我的测试脚本中的package.path值…当然,我必须通过添加一个额外的条目来修改它 – 一条通向main.lua的路径.
但除此之外,包路径是相同的.
>我在main.lua中添加了print语句,以证明它正在进入update_widget方法……并且它只是没有尝试创建postgres.
>我在测试脚本中添加了luasql.postgres库,看看是否有帮助……就像这样:

package.path = '/var/x/appname/main.lua;'

local pgdb = require("luasql.posgres")

print(pgdb)
myenv = assert(lua.postgres()) -- fails

测试脚本也试图创建这个对象…我将继续打猎.它一定是路径的问题……但我看不出Web应用程序加载时创建的路径与测试脚本中的路径之间的区别.
我现在要使用DIFF工具进行比较.

任何建议,将不胜感激.

谢谢.

编辑1

我绝对认为这是路径,虽然我不知道这里有什么问题.
我创建了另一个测试脚本(让我们称之为test3)..但是这次,我没有通过为package.path分配值来显式设置路径.
我只是尝试包含luasql.postgres pacakge并以原始测试脚本的方式使用它…它的工作原理!
所以这里的代码有效:

luasql = require "luasql.postgres"
local myenv = assert (luasql.postgres())
print(myenv)

但这失败了:

package.path = package.path .. ';/usr/share/myapp/main.lua'

luasql = require "luasql.postgres"
myenv = assert (luasql.postgres())
print(myenv)

同样对于大狼来说,我在lua中尝试了交互模式……我的代码工作得很好.

Lua 5.1.5  Copyright (C) 1994-2012 Lua.org,PUC-Rio
> pgdb = require("luasql.postgres")
> print(pgdb)
table: 0x176cb228
> myenv=assert(luasql.postgres())
> print(myenv)
PostgreSQL environment (0x176c9d5c)
>

所以……这是交互模式下的package.path变量:

> print(package.path)
./?.lua;/usr/local/share/lua/5.1/?.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
>

这是我原来的测试脚本失败的路径.

/usr/share/myapp/main.lua;./?.lua;/usr/local/share/lua/5.1/?.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

解决方法

这是路径的问题.我仍然不确定到底出了什么问题,但我改变了测试脚本中的逻辑:

package.path = '/usr/share/myapp/main.lua;' -- resetting package path manually
package.path=package.path ..'./?.lua;/usr/local/share/lua/5.1/?.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

package.path = package.path .. '/usr/share/myapp/main.lua' -- append to default path.

现在它找到了lua postgres包,让我也可以调用这些函数

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读