29

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

def main():
    do_stuff()

if __name__ == '__main__':
    main()

是否有在 Julia 中设置的类似变量,以便脚本可以知道它是使用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 的当前发行版中是否存在类似的功能?

4

5 回答 5

9

官方 Julia 文档建议这样做:

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

于 2017-08-09T20:10:13.563 回答
8

虽然isinteractive()可以让您辨别 REPL 在命令行上运行/导入到其他代码中,但无法获得与 Python 的if __name__ == '__main__'.

这似乎没有计划为一项功能。请参阅邮件列表上的此讨论。(从 2013 年 6 月开始)

于 2013-11-27T02:04:54.297 回答
7

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

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
于 2015-11-10T14:29:31.320 回答
5

我用

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

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

(刚刚添加了""!=PROGRAM_FILE“REPL include”案例,有点拗口)

于 2018-06-20T09:50:08.120 回答
3

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

于 2013-01-22T20:34:30.320 回答