Как вызвать программу из Lua

#lua #call

#lua #вызов

Вопрос:

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

Комментарии:

1. Поймите, что даже если бы вы могли вызвать внешнюю программу, которую, похоже, разработчик игры отключил, она не была бы связана с игрой. Следовательно, любые функции, которые не встроены в stock lua.exe будет недоступен.

Ответ №1:

Вам не нужно запускать другой экземпляр Lua, чтобы запустить другой скрипт Lua1. Если вы просто хотите вызвать другой скрипт 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 возможности и не будет связан с вашим родительским скриптом — при условии, что у пользователя даже установлен автономный lua интерпретатор и находится на их пути, что маловероятно в игровой среде Windows.