在Julia脚本中,您能否判断脚本是否已导入或直接执行?
python中的一个常见约定是按如下方式构造脚本的主要功能,这样它既可以作为脚本直接运行,也可以在导入时不执行在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
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的方法。