kaka888 10 Опубликовано: 24 января, 2019 (изменено) Пробовал load(), читал в вики об этой функции и ничего не получилось. Изменено 24 января, 2019 пользователем kaka888 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 25 января, 2019 3 минуты назад, kaka888 сказал: Тут в result приходит функция? Угу, угу. Если на вход load подать строку, в которой нет синтаксических ошибок, эта строка скомпилится и вернется в виде функции, которую можно вызвать когда пожелаешь. Если были ошибки, возвращается nil и инфа об этих ошибках. С load еще связано множество приколюх, но для данной задачи достаточно простой загрузки кода 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 24 января, 2019 В OpenOS можно использовать, например, такой код: os.execute("/bin/components screen -l") Так будет запущена программа components с параметрами screen -l 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 25 января, 2019 Если используется 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 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kaka888 Автор вопроса 10 Опубликовано: 24 января, 2019 А других нет способов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 24 января, 2019 Есть и другие. Можно использовать shell.execute. И это даже более правильно, т.к. эта функция используется внутри os.execute. А внутри shell.execute используется чтение указанного файл, его загрузка через load, и запуск. То есть, другие способы в конечном итоге сводятся к чтению содержимого файла, компиляции исходного кода и запуску. А другой отдельной функции, скорее всего, нет. Возможно, в других операционных системах есть иные способы. 16 минут назад, kaka888 сказал: А других нет способов? Нужно уточнить, для чего требуется другой способ, в какой среде выполняется программа. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kaka888 Автор вопроса 10 Опубликовано: 25 января, 2019 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 приходит функция? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
kaka888 Автор вопроса 10 Опубликовано: 25 января, 2019 Ого. Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Пробовал load(), читал в вики об этой функции и ничего не получилось.
Изменено пользователем kaka888Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах