Как вызвать программу из Lua - PullRequest
1 голос
/ 09 июня 2011

У меня есть встроенный экземпляр Lua из игры без поддержки внешних DLL. Я хочу вызвать программу из Lua, которая создает второй экземпляр Lua. Мой вопрос, как назвать любую программу на Lua? Я думаю, что решение "os.execute ()" было бы плохим (на некоторых машинах ограничено os.library).

1 Ответ

11 голосов
/ 09 июня 2011

Вам не нужно запускать другой экземпляр Lua для запуска другого сценария Lua 1 . Если вы просто хотите вызвать другой скрипт Lua, вы можете использовать dofile(filename). Если вы хотите сделать это в другой среде (в 5.1), вы можете сделать что-то вроде этого:

local f = assert(load(filename)) -- the assert makes the failure case
                                 -- an error
local env = {} --insert whatever globals you want the script to have

setfenv(f, env) --set the script function to execute with the table
                --you have constructed as its environment
f() --Run the script in the constructed environment

Если вам действительно нужно запустить другую программу (скажем, интерпретатор для другого языка сценариев), вы не сможете сделать это без использования os.execute() (или io.popen(), еще одна библиотечная функция, которая захватывает потоки ввода и вывода порожденной программы, что даже больше достойно ограничения).

Однако, если вы пишете свой сценарий для игры, которая не удаляет os.execute(), можно с уверенностью предположить, что функция будет доступна на компьютерах других пользователей: среда Lua поддерживается приложением для встраивания ( сама игра) а не какая-либо другая установка на автомате. Когда дело доходит до игр, на самом деле есть четыре сценария, в которых вы не сможете создавать процессы:

  1. Разработчик игры удалил библиотечные функции, такие как os.execute, из среды сценария Lua игры. В этом случае сценарии Lua не могут порождать процессы по своему замыслу: если бы это было возможно, не было бы особого смысла ограничивать доступ к функциям.

  2. Игра запускается в операционной среде, где она не может порождать дочерние процессы (например, ограниченная учетная запись сервера). В этом случае игра не может запускать другие программы, даже если она хочет , поскольку это запрещено на уровне операционной системы.

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

  4. Конечный пользователь внедрил собственную изолированную программную среду для запускаемых сценариев. В этом случае пользователь может принять решение, если он доверяет потребности вашего сценария в os.execute, достаточном для исключения из него.

1 : Любой скрипт, который будет запускаться таким образом, будет иметь только базовые возможности lua и никакого подключения к вашему родительскому скрипту - при условии, что у пользователя даже есть автономный * Установлен интерпретатор 1047 * и в его PATH, что маловероятно в игровой среде Windows.

...