2013-01-22 10 views
14

अजगर में एक आम सम्मेलन के रूप में निम्नानुसार एक स्क्रिप्ट का मुख्य कार्यक्षमता की संरचना करने के है, इसलिए यह दोनों सीधे एक स्क्रिप्ट के रूप में चलाया जा सकता है या आयातित आयात के समय main() को क्रियान्वित करने के बिना:जूलिया लिपि के भीतर, क्या आप बता सकते हैं कि स्क्रिप्ट को आयात या निष्पादित किया गया है या नहीं?

def main(): 
    do_stuff() 

if __name__ == '__main__': 
    main() 

वहाँ एक है समान चर जो जूलिया में सेट हो जाता है, ताकि स्क्रिप्ट को पता चल सके कि इसे require("script.jl" का उपयोग करके आयात किया गया था या सीधे निष्पादित किया गया था?

उदाहरण के लिए, कहते हैं कि मैं दो लिपियों, a.jl और b.jl है, एक magic_function() कि प्रकार कार्य करता है के साथ:

a.jl:

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

b.jl:

require("a.jl") 

अनुयायियों को निष्पादित करना में ...

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

कारण आदेशों परिणाम magic_function() की तरह एक समारोह जूलिया की वर्तमान वितरण में मौजूद है?

उत्तर

1

आप isinteractive() फ़ंक्शन चाहते हैं। इसे आरईपीएल में आज़माएं, इसकी तुलना इसकी तुलना एक स्क्रिप्ट से कॉल करने के परिणाम के साथ करें, जैसे कि इस बाश वन-लाइनर: julia -e "println(isinteractive())"

+2

क्या वही बात है, यद्यपि? 'julia test.jl' जहां स्क्रिप्ट बस' println (isinteractive()) 'false' प्रिंट करेगा, जबकि' python test.py'/'print __name__ == '__main __'' 'सत्य 'प्रिंट करेगा। – DSM

+5

यह मेरी ज़रूरत नहीं है: isinteractive() परीक्षण करता है कि इसे आरईपीएल से या julia my_script.jl चलाने से निष्पादित किया गया है, नहीं, मैं julia my_script.jl या julia script_that_requires_my_script.jl चलाता हूं। स्पष्टता के लिए सवाल अद्यतन कर रहा है। –

5

जबकि isinteractive() आपको आरईपीएल को अन्य कोड में आयात/कमांडलाइन पर चलाने से रोकने की सुविधा देगा, तो पाइथन के if __name__ == '__main__' के समान कार्यक्षमता प्राप्त करने का कोई तरीका नहीं है।

ऐसा लगता है कि यह एक सुविधा के रूप में योजनाबद्ध नहीं है। यह discussion on the mailing list देखें।

module mymod 
    # stuff here 
end 

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

तो फिर तुम सामान्य रूप में मॉड्यूल आयात कर सकते हैं, लेकिन आप इस तरह कमांड लाइन से व्यवहार की तरह निष्पादन आह्वान कर सकते हैं: (जून 2013 से)

3

यह सबसे अच्छा समाधान मैं पाया है है

julia mycode.jl --run 

बयान भी यह करने के लिए छोटा किया जा सकता है अगर अगर आप कोई अन्य तर्कों स्क्रिप्ट को पारित करने के लिए है:

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'' "" डिफ़ॉल्ट आरईपीएल पर है, और सभी तारों में '" "' 'है। अन्य पथ-आधारित झूठी-सकारात्मक भी हो सकते हैं। –

+0

ओह, धन्यवाद। मैट। तुम सही हो। मैंने जवाब बदल दिया। –

संबंधित मुद्दे

 संबंधित मुद्दे