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
当前Julia的发行版中是否存在magic_function()
这样的函数?
答案 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
,变得有点口不清了)