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

在Julia脚本中,您能否判断脚本是否已导入或直接执行?,julia,Julia,python中的一个常见约定是按如下方式构造脚本的主要功能,这样它既可以作为脚本直接运行,也可以在导入时不执行main(): def main(): do_stuff() if __name__ == '__main__': main() Julia中是否设置了类似的变量,以便脚本可以知道它是使用require(“script.jl”)导入的还是直接执行的 例如,假设我有两个脚本,a.jl和b.jl,以及一个magic_函数(),其行为如下: a.jl: println("D

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

def main():
    do_stuff()

if __name__ == '__main__':
    main()
Julia中是否设置了类似的变量,以便脚本可以知道它是使用
require(“script.jl”
)导入的还是直接执行的

例如,假设我有两个脚本,
a.jl
b.jl
,以及一个
magic_函数()
,其行为如下:

a.jl

println("Did we execute a.jl directly? ", magic_function())
require("a.jl")
b.jl

println("Did we execute a.jl directly? ", magic_function())
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\u function()
的函数?

您需要
isinteractive()
函数。在REPL中尝试一下,将其结果与从脚本调用它的结果进行比较,如BASH one liner:
julia-e“println(isinteractive())”

,而
isinteractive()
将让您区分REPL是在命令行上运行还是导入到其他代码中,如果uuu name uuuu=='uuuu main uuu',就无法获得与Python的
完全相同的功能


这似乎不是计划中的一项功能。看这个。(从2013年6月开始)

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

模块mymod
#这里的东西
结束
如果长度(ARGS)>0&&ARGS[1]=“运行”
使用mymod
mymod.myfunction()
结束
然后,您可以正常导入模块,但可以从命令行调用类似可执行文件的行为,如下所示:

julia mycode.jl --run
如果没有其他参数传递给脚本,if语句甚至可以缩短为:

如果ARGS==[“--run”]
#等等。。。
结束

Julia官方文件建议:

if abspath(PROGRAM_FILE) == @__FILE__

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

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

Ref:“如何检查当前文件是否作为主脚本运行?” 我使用

if ""!=PROGRAM_FILE && realpath(@__FILE__) == realpath(PROGRAM_FILE)
我似乎在上面否决了一个类似的解决方案,我想知道这有什么问题,我将它用于一些单元测试和一些同样是命令行
chmod 755
utils的模块


(刚刚为“REPL include”案例添加了
“”!=程序文件
,变得有点吞吞吐吐)

但这是同一回事吗
julia test.jl
其中脚本是简单的
println(isinteractive())
将打印
false
,而
python test.py
/
print
将打印
True
。这不是我需要的:isinteractive()测试它是从REPL执行还是从运行julia my_script.jl执行,而不是我运行了julia my_script.jl或julia script_所需的julia my_script.jl。为了清楚起见,更新问题。不太清楚<代码>程序文件
在默认REPL中是
,并且所有字符串都包含
。可能还有其他基于路径的误报。这不起作用:当我运行
/script.jl
时,
@\uuuuu文件
/home/me/script.jl
程序文件
/script.jl
。后者不包含在前者中,因此条件为false@oyd11上面的解决方案总是有效的。以目前的形式,从2020-2021年开始,我认为这应该是公认的答案。如果我编写一个脚本
abc.jl
,导入你的
mycode.jl
并执行
julia abc.jl
,那么你的
mycode.jl
仍会认为它正在直接运行,这是不正确的。如果是这样,那么您的答案就不等同于Python的方法。