2011-06-09 62 views
1

我有一個遊戲中沒有外部DLL支持的嵌入式Lua實例。 我想從Lua調用一個程序,它創建了第二個Lua實例。 我的問題是如何調用Lua中的任何程序? 我認爲「os.execute()」解決方案會很糟糕(某些機器上的os.library受限制)。如何從Lua調用程序

+1

意識到即使你可以調用一個外部程序,它聽起來像遊戲開發者已經禁用了,它不會與遊戲相關聯。因此,任何不是內置於庫存lua.exe的函數都將不可用。 – BMitch 2011-06-09 14:56:28

回答

11

你不需要啓動另一個Lua實例來運行另一個Lua腳本。如果您只想調用另一個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. 最終用戶爲其運行的腳本實施了自己的沙箱。在這種情況下,用戶可以做出決定,如果他們相信您的腳本對os.execute的需求足以對其進行例外。

:任何腳本,你會這種方式運行將只擁有基礎lua設施和腳本 - 假設即使安裝了獨立lua解釋用戶和他們的路徑到你的父母沒有任何聯繫,這在Windows遊戲環境中不太可能。