2013-01-22 7 views
14

Wspólna konwencja w Pythonie jest zorganizować główną funkcjonalność skryptu w następujący sposób, więc może to być zarówno uruchomić jako skrypt bezpośrednio lub importowane bez wykonywania main() w momencie importu:Czy w skrypcie Julii można sprawdzić, czy skrypt został zaimportowany lub wykonany bezpośrednio?

def main(): 
    do_stuff() 

if __name__ == '__main__': 
    main() 

Czy istnieje podobna zmienna, która zostanie ustawiona w Julii, aby skrypt mógł wiedzieć, czy został zaimportowany przy użyciu require("script.jl"), czy wykonać bezpośrednio?

Załóżmy, że mam dwa skrypty, a.jl i b.jl wraz z magic_function() który zachowuje się w sposób następujący:

a.jl:

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

b.jl:

require("a.jl") 

Wykonanie zapytania Dzięki polecenia skutkuje ...

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

Czy funkcja jak magic_function() istnieje w bieżącej dystrybucji Julia?

Odpowiedz

1

Chcesz funkcję isinteractive(). Wypróbuj go w REPL, porównaj jego wynik z wynikiem wywołania go ze skryptu podobnego do tego z BASH: julia -e "println(isinteractive())".

+2

Czy to jednak to samo? 'julia test.jl' gdzie skrypt jest po prostu' println (isinteractive()) 'wypisze' false', natomiast 'python test.py' /' print __name__ == '__main __' 'wypisze' True'. – DSM

+5

To nie jest dokładnie to, czego potrzebuję: isinteractive() sprawdza, czy jest wykonywany z REPL lub z uruchomionego julia my_script.jl, czy nie uruchomiłem julia my_script.jl lub julia script_that_requires_my_script.jl. Aktualizuję pytanie dla jasności. –

5

Podczas gdy isinteractive() pozwoli ci odróżnić REPL od uruchomienia na linii poleceń/zaimportowaniu do innego kodu, nie ma sposobu, aby uzyskać dokładnie taką samą funkcjonalność jak if __name__ == '__main__' Pythona.

Wydaje się, że nie jest to planowana funkcja. Zobacz ten discussion on the mailing list. (Od czerwca 2013)

3

Jest to najlepsze rozwiązanie znalazłem:

module mymod 
    # stuff here 
end 

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

Następnie można zaimportować moduł jako normalne, ale można wywołać wykonywalny jak zachowanie z linii poleceń tak:

julia mycode.jl --run 

if może być skrócony nawet do tego, jeśli nie masz innych argumentów przekazać do skryptu:

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

Jak to jest ten kod?

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

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

end 

Funkcja do_something jest wykonywana tylko wtedy, gdy kod jest wykonywany, gdy kod nie jest importowana z innych kodów.

+0

Niezupełnie.'PROGRAM_FILE' ma' '" 'przy domyślnym REPL, a wszystkie łańcuchy zawierają' '" '. Mogą istnieć również inne fałszywe alarmy oparte na ścieżce. –

+0

Och, dzięki. Matt. Masz rację. Zmieniłem odpowiedź. –

Powiązane problemy