Lua loadfile не находит файл

У меня был некоторый код lua со следующей строкой:

JSON = loadfile("JSON.lua")()

Файл JSON.lua находится в том же каталоге, что и код lua, из которого пришла строка. Этот код работал у меня некоторое время, а затем, не изменив ни исходный код lua, ни JSON.lua, ни разрешение каких-либо файлов, ни каталог, из которого я выполнял код lua, я начал получать ноль ошибка в этой строке. (Я просто не помню НИКАКИХ соответствующих изменений, которые могли бы оказать какое-либо влияние на код lua.)

Добавление подтверждения показало, что ошибка была вызвана тем, что файл не был найден. Игра с правами доступа к файлам, перезапуск моего компьютера не решили проблему, а возврат кода, который я зарегистрировал и работал отлично, не решил эту ошибку.

Я исправил ошибку, изменив приведенную выше строку, указав абсолютный путь к этому файлу JSON.lua.

Есть ли что-то, объясняющее, почему код без абсолютного пути мог работать некоторое время, а затем перестал работать?

Примечание. Такое поведение работы, а затем не работы происходило со мной дважды за неделю. Я озадачен, и хотя теперь я нашел решение, мне действительно любопытно, как объяснить такое прерывистое поведение.

2 ответа

Решение

Луа использует package.path, чье значение по умолчанию берется из переменной окружения LUA_PATH, если оно задано, в качестве списка каталогов для поиска. Вы можете положить . в начале этого списка, чтобы загрузить файлы из текущего каталога, или вы можете поместить свои файлы в путь в списке.

Поздний ответ на это, так как я обнаружил точно такую ​​же проблему.

Во-первых, вопреки предыдущему ответу, loadfile не использует package.path путь поиска. Он выглядит только в указанном каталоге. И если вы не укажете каталог, он будет выглядеть только в "текущем каталоге". Я не могу точно объяснить, почему он перестал работать на вас, но, вероятно, ваш Lua-код каким-то образом запускается с "текущим каталогом", отличным от предыдущего.

Существует два возможных исправления: одно - указать абсолютный путь к loadfile,

JSON = loadfile("c:\\my_folder\\JSON.lua")()

Альтернативное исправление зависит от конкретной библиотеки, которую вы используете, и я подозреваю, что это библиотека Lua JSON Джеффри Фридла. Поскольку это поддерживает более новый механизм модуля Lua, вы можете просто загрузить модуль с помощью require, который поддерживает package.path путь поиска.

JSON = require("JSON")
Другие вопросы по тегам