2014-12-25 2 views
4

Я пишу сценарий Lua и пытаюсь использовать require на файле, который существует в том же каталоге, что и основной скрипт. Кажется, мне не кажется, что нужно работать в этом случае, и попробовал несколько решений, которые я нашел, но ни один из них не работает. У меня есть следующие файлы вместе в каталоге:Lua Relative Path Обязательный

main.lua 
helper.lua 

Я попытался следующие решения и получили ошибку после каждого:

Решение 1:

local folderOfThisFile = (...):match("(.-)[^%.]+$") 
local helper = require(folderOfThisFile .. 'helper') 

lua: ...domizerWPF\DataFiles\LUA\main.lua:2: attempt to index local 'pathOfThisFile' (a nil value) 
stack traceback: 
    ...domizerWPF\DataFiles\LUA\main.lua:2: in main chunk 
    [C]: ? 

Решение 2:

package.path = "/?.lua;" .. package.path 
local helper = require('helper') 

lua: ...domizerWPF\DataFiles\LUA\main.lua:2: module 'helper' not found: 
    no field package.preload['helper'] 
    no file '/helper.lua' 
    no file '.\helper.lua' 
    no file 'C:\Program Files (x86)\Lua\5.1\lua\helper.lua' 
    no file 'C:\Program Files (x86)\Lua\5.1\lua\helper\init.lua' 
    no file 'C:\Program Files (x86)\Lua\5.1\helper.lua' 
    no file 'C:\Program Files (x86)\Lua\5.1\helper\init.lua' 
    no file 'C:\Program Files (x86)\Lua\5.1\lua\helper.luac' 
    no file '.\helper.dll' 
    no file '.\helper51.dll' 
    no file 'C:\Program Files (x86)\Lua\5.1\helper.dll' 
    no file 'C:\Program Files (x86)\Lua\5.1\helper51.dll' 
    no file 'C:\Program Files (x86)\Lua\5.1\clibs\helper.dll' 
    no file 'C:\Program Files (x86)\Lua\5.1\clibs\helper51.dll' 
    no file 'C:\Program Files (x86)\Lua\5.1\loadall.dll' 
    no file 'C:\Program Files (x86)\Lua\5.1\clibs\loadall.dll' 
stack traceback: 
    [C]: in function 'require' 
    ...domizerWPF\DataFiles\LUA\main.lua:2: in main chunk 
    [C]: ? 

Я пробовал варианты решения 2 с различными путями, такими как «? .lua;» и "./?lua;" но безрезультатно.

+0

Каков текущий рабочий каталог для вашего процесса? –

+0

Вы имеете в виду lua exe или скрипт? Lua exe находится в программных файлах (x86). Скрипт находится в отдельной папке: c: \ lua files \. – Lance

+0

«lua.exe» - требует поиска файлов по отношению к CWD, насколько я помню. –

ответ

3

Эти две строк сообщения об ошибке пролить некоторый свет на вашей проблеме:

no file '/helper.lua' 
no file '.\helper.lua' 

Первая линия связана с вашими изменениями в package.path. Как вы можете видеть, он ищет файл «/helper.lua», который не существует, поэтому он ничего не делает. Вторая строка связана с пакетом package.path по умолчанию и ищет «helper.lua» в текущем рабочем каталоге. Поскольку его не найти, ваш текущий рабочий каталог не должен быть каталогом, на котором находится main.lua.

Исправление либо сделать текущий рабочий каталог каталог, в котором main.lua и helper.lua расположены или добавить "C:\\path\\to\\your\\lua\\project\\?.lua" к package.path

+0

Проблемы с Workdir не связаны с кодом и полностью лежат на стороне хоста (lua.exe или его стартер или приложение для внедрения в приложение). Что, если изменяется путь к скрипту? Правильными способами являются: a) cd перед запуском, b) использование специального загрузчика (если встроено). – user3125367

1

я все еще учусь Lua, но вот что я могу кнут для вас, , если у вас нет файловой системы API установлен, то вы можете сделать строковую переменную с вашей curent рабочей директории в нем, и вы можете добавить к нему, как этот

local cwd="C:\users\user\Desktop\" 
dofile(cwd.."program.lua") 

то, что я делаю , и у меня нет проблем с этим

0

Если вы имеете в виду, что вы хотите, чтобы иметь возможность вызвать программу из любого каталога, и что он правильно находит require d файлов, то вы можете использовать это решение (требуется только его в main.lua):

local base_path = string.match(arg[0], '^(.-)[^/\\]*$') 
package.path = string.format("%s;%s?.lua", package.path, base_path) 

Это работает путем добавления каталога, в котором файл относится к пути пакета, так что require может работать с файлами в этом каталоге. Lua не делает это автоматически (Python делает, начиная с версии 2.6 или около того); мы надеемся, что это будет реализовано в будущем. Вы также можете использовать base_path для ссылки на другие файлы в том же каталоге. В моем случае, например, имеется база данных SQLite в этом каталоге, и программа должна открыть его, так что я использую это:

local database_filename = base_path .. 'db.sqlite' 

Вы также можете сделать base_path глобальными, так что он доступен для других модулей, если это необходимо.