В юлине script можете ли вы указать, был ли импортирован или запущен файл script? - программирование
Подтвердить что ты не робот

В юлине script можете ли вы указать, был ли импортирован или запущен файл script?

Общим соглашением в python является структурирование основных функций script следующим образом, поэтому он может быть запущен как script напрямую или импортирован без выполнения main() во время импорта:

def main():
    do_stuff()

if __name__ == '__main__':
    main()

Есть ли аналогичная переменная, которая устанавливается в Julia, так что script может знать, был ли он импортирован с помощью 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() в текущем распределении Julia?

4b9b3361

Ответ 1

Пока isinteractive() позволит вам распознать, что REPL запускается в командной строке/импортируется в другой код, нет возможности получить точно такую ​​же функциональность, как Python if __name__ == '__main__'.

Это, похоже, не планируется как функция. См. Обсуждение в списке рассылки. (с июня 2013 года)

Ответ 2

Это лучшее решение, которое я нашел:

module mymod
    # stuff here
end

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

Затем вы можете импортировать модуль как обычно, но вы можете вызывать исполняемый файл как поведение из командной строки следующим образом:

julia mycode.jl --run

Оператор if может быть даже сокращен до этого, если у вас нет других аргументов для перехода к script:

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

Ответ 3

Вам нужна функция isinteractive(). Попробуйте в REPL, сравните его результат с результатом вызова его из script, как в этом BASH однострочном: julia -e "println(isinteractive())".

Ответ 4

Я использую

if ""!=PROGRAM_FILE && realpath(@__FILE__) == realpath(PROGRAM_FILE)

Мне кажется, за подобное решение было отказано выше, я хотел бы знать, что с этим не так, я использую это как для нескольких юнит-тестов, так и для некоторых модулей, которые также используются в командной строке chmod 755

(только что добавил ""!=PROGRAM_FILE для случая "REPL include", становясь немного глотком)

Ответ 5

Официальный Юлия Док предлагает следующее:

if abspath(PROGRAM_FILE) == @__FILE__

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

end

Функция do_something выполняется только при выполнении кода, а не при импорте кода из других кодов.

Ссылка: "Как проверить, выполняется ли текущий файл в качестве основного скрипта?"https://docs.julialang.org/en/v1/manual/faq/#How-do-I-check-if-the-current-file-is-being-run-as-the-main-script?-1