【发布时间】:2014-07-21 20:38:48
【问题描述】:
背景资料:
我刚接触 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
测试脚本也在试图创建这个对象时死掉了……我会继续四处寻找。这一定是路径的问题......但我看不出由网络应用程序加载时创建的路径与我在测试脚本中所拥有的路径之间的区别。 我现在将使用 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)
另外,greatwolf 的观点是,我在 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/分享/lua/5.1/?/init.lua
【问题讨论】:
-
你能通过一个 lua 解释器或 repl 来测试一下,看看
luasql.postgres返回了什么?根据github repopostgres本身应该是一个函数。 -
greatwolf,请看我的编辑 1