module - El módulo lua no está cargando bibliotecas
(2)
Fue un problema con el camino. Todavía no estoy seguro exactamente de lo que estaba mal, pero cambié mi lógica en el script de prueba de:
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
''
a
package.path = package.path .. ''/usr/share/myapp/main.lua'' -- append to default path.
Ahora encuentra el paquete lua postgres y me permite llamar a las funciones también
Información de antecedentes:
Soy nuevo para lua y estoy tratando de entender cómo funcionan los módulos. Pero estoy tratando de cargar un módulo preexistente en un nuevo script y ejecutar este script desde la línea de comando.
Código:
Tengo un archivo llamado módulo main.lua que se ve así:
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.
Ahora estoy tratando de crear un script de prueba para este módulo. Tengo la siguiente lógica en un archivo lua separado:
package.path = ''/usr/share/myapp/main.lua;''
local my_object = require("main")
print my_object.update_widget
Problema:
Recibo el siguiente error cuando trato de ejecutar mi script de prueba:
attempt to call field ''postgres'' (a table value)
La línea en la que falla está en el método connect_to_db () donde trato de crear una variable de entorno:
env = assert (luasql.postgres())
Lo que he intentado hasta ahora:
Modifiqué
package.path
en mi script de prueba para que coincida con lo que usa main.lua. Lo hice ejecutando main.lua de la manera "normal", impulsado por una aplicación web, y volcando el contenido depackage.path
a un archivo de registro. Copié la ruta del archivo de registro y la utilicé como valor depackage.path
en mi script de prueba ... por supuesto, tuve que modificarlo agregando una entrada adicional, una ruta que conduce a main.lua.
Pero aparte de eso, las rutas del paquete son las mismas.He agregado instrucciones de impresión dentro de main.lua para probar que está entrando en el método update_widget ... y que está fracasando al tratar de crear el postgres.
Agregué la biblioteca luasql.postgres en el script de prueba para ver si eso ayudaría ... así:
package.path = ''/var/x/appname/main.lua;'' local pgdb = require("luasql.posgres") print(pgdb) myenv = assert(lua.postgres()) -- fails
El script de prueba también muere al tratar de crear este objeto ... Voy a seguir buscando. Debe ser un problema con las rutas ... pero no puedo ver la diferencia entre la ruta creada cuando la carga la aplicación web y la que tengo en el script de prueba. Voy a usar una herramienta DIFF para comparar por ahora.
Cualquier sugerencia sera apreciada.
Gracias.
EDIT 1
Definitivamente creo que es el camino, aunque todavía no puedo ver qué sucede aquí. Creé otro script de prueba (llamémoslo test3) ... pero esta vez, no establecí explícitamente el camino asignando valores a package.path. Solo traté de incluir el pacakge luasql.postgres y usarlo como lo hace el script de prueba original ... ¡y funciona! Así que aquí está el código que funciona:
luasql = require "luasql.postgres"
local myenv = assert (luasql.postgres())
print(myenv)
Pero esto falla:
package.path = package.path .. '';/usr/share/myapp/main.lua''
luasql = require "luasql.postgres"
myenv = assert (luasql.postgres())
print(myenv)
También al punto de greatwolf, lo intenté desde el modo interactivo en lua ... y mi código funciona muy bien.
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)
>
Entonces ... aquí está la variable package.path del modo interactivo:
> 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
>
Y aquí está la ruta desde mi script de prueba original donde falla.
/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
Cuando Lua ejecuta require "luasql.postgres"
, intenta encontrar postgres.lua en la carpeta luasql
en cualquier lugar de su LUA_PATH
, lo carga y lo ejecuta, poniendo así cualquier variable no local (incluidas las funciones) que aparece en el nivel de módulo de postgres.lua
en el espacio de nombres global El main.lua
que muestra requiere un módulo y luego lo usa como una función: luasql.postgres()
. Esto solo funcionará si se usa algún truco. Por ejemplo, si el módulo cargado devuelve una función, puede usar
fn = require ''luasql.postgres''
fn()
para ejecutar la función devuelta.
Además, a diferencia de Python, donde puedes importar elementos desde un módulo, en Lua no puedes. Por lo tanto, no es como postgres podría ser una función o tabla invocable.
Si reemplaza main.lua
con lo siguiente,
require ''luasql.postgres''
luasql.postgres()
y ejecuta tu script de prueba, o ejecuta main.lua
directamente, deberías obtener un error. Si no lo hace, el módulo definitivamente está haciendo algo especial para respaldar este uso.
Si cambias tu main.lua
como arriba y no funciona, entonces tampoco puedes hacer
env = assert (luasql.postgres())
pero puedes hacer cualquiera de estos, dependiendo de lo que haga postgres.lua
:
env = assert (luasql.postgres)
env = assert (someFunctionDefinedInPostgresModule)
env = assert (someFunctionDefinedInPostgresModule())
env = assert (luasql.postgres.someFunction)
env = assert (luasql.postgres.someFunction())