module lua

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:

  1. 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 de package.path a un archivo de registro. Copié la ruta del archivo de registro y la utilicé como valor de package.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.

  2. 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.

  3. 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())