2013-01-22 67 views
14

Python中的共同約定如下構建腳本的主要功能,因此既可以直接運行的腳本或進口沒有在進口時執行main()在Julia腳本中,您可以判斷腳本是否已被導入或直接執行?

def main(): 
    do_stuff() 

if __name__ == '__main__': 
    main() 

是否有在Julia中設置的類似變量,以便腳本可以知道它是否使用require("script.jl"導入)或直接執行?

例如,說我有兩個腳本,a.jlb.jl,具有magic_function()該行爲如下沿:

a.jl

println("Did we execute a.jl directly? ", magic_function()) 

b.jl

require("a.jl") 

執行foll由於命令的結果...

> julia a.jl 
Did we execute a.jl directly? true 
> julia b.jl 
Did we execute a.jl directly? false 

是否像magic_function()功能在朱莉婭的電流分佈存在嗎?

回答

1

您想要isinteractive()函數。在REPL中嘗試一下,比較它的結果和從BASH單線內的腳本中調用它的結果:julia -e "println(isinteractive())"

+2

雖然這是一回事嗎? 'julia test.jl'腳本只是'println(isinteractive())'將打印'false',而'python test.py' /'print __name__ =='__main __''會打印出'True'。 – DSM

+5

這不是我所需要的:isinteractive()測試它是從REPL執行還是從運行julia my_script.jl執行,不是我運行julia my_script.jl或julia script_that_requires_my_script.jl。更新問題的清晰度。 –

5

雖然isinteractive()可讓您辨別REPL在命令行上運行/導入到其他代碼中,但無法獲得與Python的if __name__ == '__main__'完全相同的功能。

這似乎沒有被規劃爲一項功能。請參閱discussion on the mailing list。 (從2013年6月)

3

這是我已經找到了最好的解決辦法:

module mymod 
    # stuff here 
end 

if length(ARGS)>0 && ARGS[1] == "--run" 
    using mymod 
    mymod.myfunction() 
end 

然後你就可以導入模塊正常的,但你可以調用可執行像這樣的命令行的行爲:

julia mycode.jl --run 

if語句甚至可以縮短到這一點,如果你沒有其他的參數傳遞給腳本:

if ARGS == ["--run"] 
    # etc... 
end 
-1

這段代碼是怎麼回事?

if length(PROGRAM_FILE)!=0 && contains(@__FILE__, PROGRAM_FILE) 

# do something only this file is executed. 
do_something() 

end 

當執行代碼,而不是當所述代碼被從其他代碼進口僅執行的do_something功能。

+0

不完全。'PROGRAM_FILE'在默認的REPL處是''「',並且所有的字符串都包含'」「'。也可能有其他基於路徑的誤報。 –

+0

哦,謝謝。馬特。你是對的。我改變了答案。 –

相關問題