2012-01-30 17 views
5

可能重複:
「main」 function in Lua?如何檢查腳本是通過dofile()包含還是直接在Lua中運行?

在Python中,您可以檢查是否腳本正在direcly稱爲(和調用一些功能,如果是,通常用於測試)很容易:

if __name__ == "__main__": 
    main() 

有沒有辦法做同樣在Lua,如果是直接(lua foo.lua)運行或者是另一個s包括檢測cript(dofile('foo.lua'))。

總是有定義在主腳本文件中的一些虛擬全局變量dofile('foo.lua')之前,在foo.lua檢查,如果它被定義或不平凡(醜)的方式,但如果有一個更好的辦法將是巨大的去做這個。

+0

你說得對,對不起,重複...... – Wookai 2012-01-31 09:18:33

回答

7

在頂層,你可以檢查是否debug.getinfo(2)是零

http://www.lua.org/manual/5.1/manual.html#pdf-debug.getinfo

你可以給一個號碼作爲函數的值,這意味着該函數調用堆棧的水平儀功能運​​行給定線程:0級是當前函數(getinfo本身);級別1是調用getinfo的函數;等等。如果函數的數量大於活動函數的數量,那麼getinfo返回nil。

+0

對於直接從嵌入代碼運行的任何函數,這也會返回'true'。 – 2012-01-31 05:01:31

+0

這就是我認爲OP正在有效地檢查:如果這個腳本是直接調用的(或者通過require/dofile/loadfile/loadstring/etc加載) – daurnimator 2012-01-31 08:42:43

+0

我使用的是5.2.3,它似乎需要檢查調試.getinfo(3)'而不是'2'。 – dimo414 2017-09-27 06:10:02

2

不,Lua無法判斷腳本是否被「直接」調用。

記住:Lua和Python存在用於不同的目的。 Python是爲命令行腳本設計的。你編寫一個腳本,調用可能用Python,C++或其他語言編寫的模塊。 Python腳本最終是負責調用哪些代碼的時候。

Lua首先是嵌入式腳本語言。雖然你當然可以使用獨立的lua.exe解釋器來創建命令行腳本,但這是一件混亂的事情。該語言的主要目的是嵌入在用C,C++或其他任何語言編寫的應用程序中。

因此,「主」腳本的概念。你會如何定義什麼是「主」,什麼不是?如果C代碼可以隨時加載任何腳本,出於任何目的,哪一個是「主」?

如果你想定義這個概念,這很簡單。就在你的「主」腳本的頂部堅持這樣的:

do 
    local old_dofile = dofile 
    function new_dofile(...) 
    if(__is_main) then 
     __is_main = __is_main + 1 
    else 
     __is_main = 1 
    end 
    old_dofile(...) 
    __is_main = __is_main - 1 
    if(__is_main == 0) then __is_main = nil end 
    end 
    dofile = new_dofile 
end 

當然,這將不加載任何require工作;你也需要爲require寫一個這樣的版本。如果外部代碼使用C-API加載函數,它肯定不會工作(這就是爲什麼require可能無法工作)。

+0

任何理由-1? – 2012-01-31 05:00:14

+0

我沒有倒下你,但我想調用一個kludge任何使用Lua,但嵌入可能是原因。我同意,嵌入時它確實閃耀,它作爲一種腳本語言也是非常有用的。 – Wookai 2012-01-31 08:21:31

相關問題