2017-02-14 3 views
2

Как прочитать файл данных на пути пакета на Lua 5.1?Как прочитать файл данных в пути пакета на Lua 5.1

То, что я ищу, является чем-то вроде io.read, но в каталоге пакета вместо рабочего каталога (arg[0]) и без использования жестко закодированных абсолютных путей. Это было бы что-то вроде dofile, но без запуска кода, только чтение его как строки.

Пример:

У меня есть test папку, текущий рабочий каталог test.lua сценария.

В другом каталоге, где-то указанном в переменной LUA_PATH, есть пакет luapackage.

luapackage может:

  • require("luapackage.other_module");
  • dofile("other_module.lua").

Но luapackage не может сделать:

  • io.read("data.txt")
  • io.read("luapackage/data.txt")

Пример структуры:

+-test/ 
    | 
    +-test.lua 

+-luamodule/ 
    | 
    +-data.txt 
    | 
    +-luamodule.lua 
    | 
    +-other_module.lua 

Для этого примера, test.lua требует только luamodule:

-- test.lua 
local luamodule = require("luamodule") 

И luamodule нужно прочитать его модули и файлы данных:

-- luamodule.lua 
local other_module= dofile("other_module.lua") -- works 
-- local other_module= require("luamodule.other_module") -- also works 

local data = io.open("data.txt") -- fails 
-- local data = io.open("luamodule/data.txt") -- also fails 

Это не работает, потому что он ищет файл в рабочем каталоге (test), а не каталог пакетов.

Если я поместил копию пакета в папку запуска скрипта, возможно io.read(luapackage/data.txt). Но каждый скрипт должен был иметь свою собственную локальную копию luapackage.

Примечание: Я ищу решение Lua, избегая бинарных пакетов, которые могут поставить под угрозу кросс-совместимость.

ответ

1

Вы можете использовать debug.getinfo(1,"S").source, чтобы получить местонахождение текущего (модуля) файла. Замените luamodule.lua на data.txt, удалите ведущий @, и вы должны получить путь, который вам нужен.

+0

Большое спасибо! 'local PATH = string.match (debug.getinfo (1," S "). Source,"^@ (. + /) [% A% -% d_] +%. Lua $ ")' и * voilà *! –

Смежные вопросы