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

Ben*_*ner 20 julia

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

def main():
    do_stuff()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

是否有类似的变量在Julia中设置,以便脚本可以知道它是使用导入require("script.jl"还是直接执行?

例如,说我有两个脚本,a.jl并且b.jl,具有沿magic_function()该行为如下:

a.jl:

println("Did we execute a.jl directly? ", magic_function())
Run Code Online (Sandbox Code Playgroud)

b.jl:

require("a.jl")
Run Code Online (Sandbox Code Playgroud)

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

> julia a.jl
Did we execute a.jl directly? true
> julia b.jl
Did we execute a.jl directly? false
Run Code Online (Sandbox Code Playgroud)

magic_function()在Julia的当前分布中是否存在类似的函数?

Ats*_*kai 7

Julia 官方文档建议如下:

if abspath(PROGRAM_FILE) == @__FILE__

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

end
Run Code Online (Sandbox Code Playgroud)

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

Ref:“如何检查当前文件是否作为主脚本运行?” https://docs.julialang.org/en/v1/manual/faq/#How-do-I-check-if-the-current-file-is-being-run-as-the-main-script?- 1


ast*_*nna 6

虽然isinteractive()可以让你看到REPL在命令行上运行/导入到其他代码中,但是没有办法获得与Python完全相同的功能if __name__ == '__main__'.

这似乎不是作为一项功能计划的.在邮件列表中查看此讨论.(2013年6月起)


use*_*470 5

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

module mymod
    # stuff here
end

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

然后您可以正常导入模块,但是您可以从命令行调用可执行文件,如下所示:

julia mycode.jl --run
Run Code Online (Sandbox Code Playgroud)

如果没有其他参数传递给脚本,if语句甚至可以缩短到这个:

if ARGS == ["--run"]
    # etc...
end
Run Code Online (Sandbox Code Playgroud)


oyd*_*d11 5

我用

if ""!=PROGRAM_FILE && realpath(@__FILE__) == realpath(PROGRAM_FILE)
Run Code Online (Sandbox Code Playgroud)

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

(刚刚添加了""!=PROGRAM_FILE“REPL 包含”案例,变得有点满嘴)


Joh*_*ite 3

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

  • 这并不是我所需要的: isinteractive() 测试它是从 REPL 还是从运行 julia my_script.jl 执行,而不是我运行 julia my_script.jl 或 julia script_that_requires_my_script.jl 。为了清楚起见更新问题。 (7认同)
  • 但这是同一件事吗?“julia test.jl”,其中脚本只是“println(isinteractive())”,将打印“false”,而“python test.py”/“print __name__ == '__main__'”将打印“True”。 (2认同)