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