Перейти к публикации

В ближайшее время постараюсь разобраться с картой сервера/ЛК/бб кодами

Внимание, с 14 февраля до 20 февраля могут проходить работы на сервере, где также находится лаунчсервер. В связи с этим авторизация в лаунчере может не работать

  • 0
kaka888

Какая функция и как запускает файл по указанному пути?

Вопрос

Пробовал load(), читал в вики об этой функции и ничего не получилось.

Изменено пользователем kaka888

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

7 ответов на этот вопрос

Рекомендованные сообщения

  • 1
3 минуты назад, kaka888 сказал:

Тут в result приходит функция?

 

Угу, угу. Если на вход load подать строку, в которой нет синтаксических ошибок, эта строка скомпилится и вернется в виде функции, которую можно вызвать когда пожелаешь. Если были ошибки, возвращается nil и инфа об этих ошибках. С load еще связано множество приколюх, но для данной задачи достаточно простой загрузки кода

  • Thanks 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 1

В OpenOS можно использовать, например, такой код:

os.execute("/bin/components screen -l")

Так будет запущена программа components с параметрами screen -l

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 1

Если используется OpenOS. Все четыре варианта более-менее схожи:

require("shell").execute("/Test.lua")
os.execute("/Test.lua")
dofile("/Test.lua")
-- Более детальное решение с безопасным запуском файла и отлавливанием всех ошибок с подробной информацией
local result, reason = loadfile("/Test.lua")
if result then
  result, reason = xpcall(result, debug.traceback)
  if result then
    -- Все замищательно
  else
    print("Не удалось выполнить файл: ", reason)
  end
else
  print("Не удалось загрузить файл: ", reason)
end

 

Если используются "чистые" опенкомпы на микроконтроллере или попросту с EEPROM:

 

local filesystem = component.proxy(component.list("filesystem")())

-- Читаем файл напрямую с диска
local handle = filesystem.open("/Test.lua", "rb")

local data, chunk = ""
repeat
  chunk = filesystem.read(handle, 4096)
  data = data .. (chunk or "")
until not chunk

filesystem.close(handle)

-- Выполняем прочитанный исходный код
local result, reason = load(data)
if result then
  result, reason = xpcall(result, debug.traceback)
  if result then
    -- Усе в порядке, файл выполнен
  else
    -- Ошибка при выполнении загруженного скрипта
  end
else
  -- Ошибка при загрузке текстовых данных в качестве кода
end

 

  • Like 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

А других нет способов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Есть и другие. Можно использовать shell.execute. И это даже более правильно, т.к. эта функция используется внутри os.execute.

А внутри shell.execute используется чтение указанного файл, его загрузка через load, и запуск.

 

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

А другой отдельной функции, скорее всего, нет. Возможно, в других операционных системах есть иные способы.

16 минут назад, kaka888 сказал:

А других нет способов?

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

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
8 часов назад, ECS сказал:

Если используется OpenOS. Все четыре варианта более-менее схожи:


require("shell").execute("/Test.lua")

os.execute("/Test.lua")

dofile("/Test.lua")

-- Более детальное решение с безопасным запуском файла и отлавливанием всех ошибок с подробной информацией
local result, reason = loadfile("/Test.lua")
if result then
  result, reason = xpcall(result, debug.traceback)
  if result then
    -- Все замищательно
  else
    print("Не удалось выполнить файл: ", reason)
  end
else
  print("Не удалось загрузить файл: ", reason)
end

 

Если используются "чистые" опенкомпы на микроконтроллере или попросту с EEPROM:

 


local filesystem = component.proxy(component.list("filesystem")())

-- Читаем файл напрямую с диска
local handle = filesystem.open("/Test.lua", "rb")

local data, chunk = ""
repeat
  chunk = filesystem.read(handle, 4096)
  data = data .. (chunk or "")
until not chunk

filesystem.close(handle)

-- Выполняем прочитанный исходный код
local result, reason = load(data)
if result then
  result, reason = xpcall(result, debug.traceback)
  if result then
    -- Усе в порядке, файл выполнен
  else
    -- Ошибка при выполнении загруженного скрипта
  end
else
  -- Ошибка при загрузке текстовых данных в качестве кода
end

 

local result, reason = load(data)
Тут в result приходит функция?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

Ого. Спасибо :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×