在Julia脚本中,您能判断脚本是已导入还是直接执行?

时间:2013-01-22 15:51:42

标签: julia

python中的一个常见约定是按如下方式构造脚本的主要功能,因此它既可以直接作为脚本运行,也可以在导入时不导入main()导入:

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")

执行以下命令会导致...

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

当前Julia的发行版中是否存在magic_function()这样的函数?

5 个答案:

答案 0 :(得分:5)

虽然isinteractive()可以让您识别REPL在命令行上运行/导入其他代码,但是无法获得与Python if __name__ == '__main__'完全相同的功能。

这似乎不是作为一项功能进行规划的。见discussion on the mailing list。 (自2013年6月起)

答案 1 :(得分:5)

这是我找到的最佳解决方案:

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

答案 2 :(得分:3)

您需要isinteractive()功能。在REPL中尝试一下,将其结果与从这个BASH单行中的脚本调用它的结果进行比较:julia -e "println(isinteractive())"

答案 3 :(得分:1)

这段代码怎么样?

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

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

end

do_something函数仅在代码执行时执行,而不是在从其他代码导入代码时执行。

答案 4 :(得分:0)

我用

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

似乎上面有一个类似的解决方案被否决了,我想知道这有什么问题,我正在将此用于一些单元测试和一些也是命令行chmod 755的模块实用程序

(只是为“ REPL include”案添加了""!=PROGRAM_FILE,变得有点口不清了)