В юлине 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?
Ответы
Ответ 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