当前位置 : 主页 > 网络编程 > lua >

lua模块没有加载库

来源:互联网 收集:自由互联 发布时间:2021-06-23
背景资料: 我只是lua的新手,我正在努力了解模块是如何工作的.但我正在尝试将预先存在的模块加载到新脚本中,并从命令行运行此脚本. 码: 我有一个名为main.lua的文件,看起来像这样:
背景资料:

我只是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包,让我也可以调用这些函数

网友评论