Перейти к содержимому
  • 0
kaka888

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

Вопрос

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

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

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


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

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

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

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

 

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

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


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

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

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

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

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


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

Если используется 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

 

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


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

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

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


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

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

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

 

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

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

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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
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 приходит функция?

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...