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的当前分布中是否存在类似的函数?
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
这是我找到的最佳解决方案:
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)
我用
if ""!=PROGRAM_FILE && realpath(@__FILE__) == realpath(PROGRAM_FILE)
Run Code Online (Sandbox Code Playgroud)
我似乎在上面投票否决了一个类似的解决方案,我想知道这有什么问题,我将它用于一些单元测试和一些也是命令行chmod 755
实用程序的模块
(刚刚添加了""!=PROGRAM_FILE
“REPL 包含”案例,变得有点满嘴)
你想要这个isinteractive()
功能。在 REPL 中尝试一下,将其结果与从脚本中调用它的结果进行比较,如 BASH 单行代码:julia -e "println(isinteractive())"
。